메뉴 건너뛰기

그외 개발정보


안녕하세요 현 대학교3학년에 재학중인 백종경입니다..
디바이스 드라이버는 처음이고, 스터디한지 1달 되었습니다.
하드에서 플로피로 파일이 넘어갈때 실시간 암호화를 하는건데요..
필터는 클래스 Upper Filter로 설치가 잘되는지 확인하였습니다.. 레지스트리를 검사하였더니
Upper Filter로 잘 들어갔는데 문제는 실시간 암호화 부분입니다..
A:\ 를 읽을하고 클릭을 하면 블루스크린이 뜨는데요..
소스를 올릴테니 어느부분이 잘못되어 있는지 갈켜주세요..
NTSTATUS VA_Dispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
/*++

Routine Description:

Common entrypoint for all Io Request Packets

Arguments:

DeviceObject - pointer to a device object.
Irp - Io Request Packet

Return Value:

NT status code.

--*/

{

struct DEVICE_EXTENSION *devExt;
PIO_STACK_LOCATION irpSp;
BOOLEAN passIrpDown = TRUE;
UCHAR majorFunc, minorFunc;
NTSTATUS status;
ULONG ioControlCode;
PUCHAR Buffer = NULL;
PFSRTL_COMMON_FCB_HEADER FcbHeader;
ULONG TotalFileSize = 0;
ULONG currentBlockFileSize = 0;
PFILE_OBJECT FileObject;
PVOID OutputBuffer;

devExt = DeviceObject->DeviceExtension;
ASSERT(devExt->signature == DEVICE_EXTENSION_SIGNATURE);

irpSp = IoGetCurrentIrpStackLocation(Irp);

/*
* Get major/minor function codes in private variables
* so we can access them after the IRP is completed.
*/
majorFunc = irpSp->MajorFunction;
minorFunc = irpSp->MinorFunction;
FileObject = irpSp->FileObject;
OutputBuffer=Irp->AssociatedIrp.SystemBuffer;

DBGOUT(("VA_Dispatch: majorFunc=%d, minorFunc=%d",
(ULONG)majorFunc, (ULONG)minorFunc));

/*
* For all IRPs except REMOVE, we increment the PendingActionCount
* across the dispatch routine in order to prevent a race condition with
* the REMOVE_DEVICE IRP (without this increment, if REMOVE_DEVICE
* preempted another IRP, device object and extension might get
* freed while the second thread was still using it).
*/
if (!((majorFunc == IRP_MJ_PNP) && (minorFunc == IRP_MN_REMOVE_DEVICE))){
IncrementPendingActionCount(devExt);
}

if ((majorFunc != IRP_MJ_PNP) &&
(majorFunc != IRP_MJ_CLOSE) &&
((devExt->state == STATE_REMOVING) oror
(devExt->state == STATE_REMOVED))){

/*
* While the device is being removed,
* we only pass down the PNP and CLOSE IRPs.
* We fail all other IRPs.
*/
status = Irp->IoStatus.Status = STATUS_DELETE_PENDING;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
passIrpDown = FALSE;
}
else {
// KeAcquireSpinLock( &CountMutex, &oldirql );
switch (majorFunc){

case IRP_MJ_PNP:
status = VA_PnP(devExt, Irp);
passIrpDown = FALSE;
break;

case IRP_MJ_POWER:
status = VA_Power(devExt, Irp);
passIrpDown = FALSE;
break;

case IRP_MJ_READ:
if(devExt->bAccess == FALSE){
status = Irp->IoStatus.Status = STATUS_UNSUCCESSFUL ;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
passIrpDown = FALSE;
}
if ( !(Irp->Flags & IRP_NOCACHE) )
break;

// 메모리 버퍼 포인터를 얻음
if ( Irp->MdlAddress )
{
// 실질적인 데이터가 들어갈 System Buffer 주소 얻음
Buffer = MmGetSystemAddressForMdl( Irp->MdlAddress );
}
else if( Irp->AssociatedIrp.SystemBuffer )
{
Buffer = Irp->AssociatedIrp.SystemBuffer;
}
else
{
Buffer = Irp->UserBuffer;
}

FcbHeader = (PFSRTL_COMMON_FCB_HEADER)irpSp->FileObject->FsContext;

// 파일의 총 길이를 구함
TotalFileSize = FcbHeader->FileSize.LowPart;

// 현 block의 암호화할 File Size를 읽는다.
currentBlockFileSize = Irp->IoStatus.Information;

// 현재의 블럭의 파일 사이즈와 전체 파일 사이즈를 비교
if (currentBlockFileSize >= TotalFileSize)
{
// 전체 파일 사이즈만큼 데이터 복호화
// DecryptionData (Buffer, TotalFileSize);
}
else
{
// 현 block의 크기만큼 파일 복호화
// DecryptionData (Buffer, currentBlockFileSize);
}

break;
case IRP_MJ_WRITE :
if ( !(Irp->Flags & IRP_NOCACHE) )
break;

DbgPrint(" Write Start\n");

if ( Irp->MdlAddress )
{

// 실질적인 데이터가 들어갈 System Buffer 주소 얻음
Buffer = MmGetSystemAddressForMdlSafe( Irp->MdlAddress,HighPagePriority );
}
else if( Irp->AssociatedIrp.SystemBuffer )
{

Buffer = Irp->AssociatedIrp.SystemBuffer;

}
else
{

Buffer = Irp->UserBuffer;
DbgPrint(" Buffer Enter!!\n");
}

FcbHeader = (PFSRTL_COMMON_FCB_HEADER)irpSp->FileObject->FsContext;

// 파일의 총 길이를 구함
TotalFileSize = FcbHeader->FileSize.LowPart;

// 현 block의 암호화할 File Size를 읽는다.
currentBlockFileSize = irpSp->Parameters.Write.Length;

// 현재의 블럭의 파일 사이즈와 전체 파일 사이즈를 비교
if (currentBlockFileSize >= TotalFileSize)
{
// 전체 파일 사이즈만큼 데이터 암호화
EncryptionData (Buffer, TotalFileSize);
DbgPrint(" Secu ing!!!!\n");
}
else
{
// 현 block의 크기만큼 파일 암호화
EncryptionData (Buffer, currentBlockFileSize);
DbgPrint(" Secu ing!!!!\n");
}
break;

case IRP_MJ_DEVICE_CONTROL:
{
if( Irp->MdlAddress )
{
OutputBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress );
}
ioControlCode = irpSp->Parameters.DeviceIoControl.IoControlCode;
if(ioControlCode == IOCTL_ACCESS_OK){
devExt->bAccess = TRUE;
status = Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
passIrpDown = FALSE;
break;
}
else if(ioControlCode == IOCTL_DO_NOT_ACCESS){
devExt->bAccess = FALSE;
status = Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
passIrpDown = FALSE;
break;
}
break;
}

case IRP_MJ_CREATE:
case IRP_MJ_CLOSE:
case IRP_MJ_SYSTEM_CONTROL:
case IRP_MJ_INTERNAL_DEVICE_CONTROL:
default:
/*
* For unsupported IRPs, we simply send the IRP
* down the driver stack.
*/
break;
}
// KeReleaseSpinLock( &CountMutex, oldirql );
}

if (passIrpDown){
IoCopyCurrentIrpStackLocationToNext(Irp);
status = IoCallDriver(devExt->topDevObj, Irp);
}
/*
* Balance the increment to PendingActionCount above.
*/
if (!((majorFunc == IRP_MJ_PNP) && (minorFunc == IRP_MN_REMOVE_DEVICE))){
DecrementPendingActionCount(devExt);
}
return status;
}

전체소스도필요하시면 올리겠습니다..제발 도움좀 주세요 ㅠㅠ.. 그래서 지금 IRP부분을 다시보고 있습니다
조언주심감사하겠습니다 꾸벅 __)




  • 빠른 답변 감사합니다..
    제가 초보라.. 아직.. 디버그도 이제 막 사용하기시작했는데요..
    물론 Windbg와 vm웨어를 써서합니다..이부분은 제가 해결해보겠습니다.. 다음에 곤란한 경우가 생길경우 도움좀 부탁드리겠습니다 꾸벅..__)
    아참... 마지막 프린터 필터 드라이버생각중인데요..
    프린터를 하게되면 허용되지 않은 사용자는 출력할경우 암호화하여 출력이 되는 프로그램을 구상하고 있는데요.. 프린터 필터 드라이버에 대한 예제소스나 공부할 수 있는 책을 추천해주시면 감사드리겠습니다..
    원서 10만원인가 하는 그책을 일단 주문을 했는데여 다른책이 있다면 추천해주세요..
    좋은 하루..즐거운 데이트 하시구요..행복한 결혼 하시길 기원하겠습니다..

    2006년 마지막달 어느초보가..드림

  • profile
    안녕하세요.

    디버그중에 사용하시는 심볼파일이라던가 에러 로그를 덤프한 내용을 참고하셔야 할듯 합니다. 제가 소스를 보고 잘못된 곳을 짚어 드리지는 않습니다.
    죄송합니다.

    *. 질문하기/쓰기 를 클릭할 경우 상단에 보이는 글을 참고해 주세요.


    >안녕하세요 현 대학교3학년에 재학중인 백종경입니다..
    >디바이스 드라이버는 처음이고, 스터디한지 1달 되었습니다.
    >하드에서 플로피로 파일이 넘어갈때 실시간 암호화를 하는건데요..
    >필터는 클래스 Upper Filter로 설치가 잘되는지 확인하였습니다.. 레지스트리를 검사하였더니
    >Upper Filter로 잘 들어갔는데 문제는 실시간 암호화 부분입니다..
    >A:\ 를 읽을하고 클릭을 하면 블루스크린이 뜨는데요..
    >소스를 올릴테니 어느부분이 잘못되어 있는지 갈켜주세요..
    >NTSTATUS VA_Dispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    >/*++
    >
    >Routine Description:
    >
    > Common entrypoint for all Io Request Packets
    >
    >Arguments:
    >
    > DeviceObject - pointer to a device object.
    > Irp - Io Request Packet
    >
    >Return Value:
    >
    > NT status code.
    >
    >--*/
    >
    >{
    >
    > struct DEVICE_EXTENSION *devExt;
    > PIO_STACK_LOCATION irpSp;
    > BOOLEAN passIrpDown = TRUE;
    > UCHAR majorFunc, minorFunc;
    > NTSTATUS status;
    > ULONG ioControlCode;
    > PUCHAR Buffer = NULL;
    > PFSRTL_COMMON_FCB_HEADER FcbHeader;
    > ULONG TotalFileSize = 0;
    > ULONG currentBlockFileSize = 0;
    > PFILE_OBJECT FileObject;
    > PVOID OutputBuffer;
    >
    > devExt = DeviceObject->DeviceExtension;
    > ASSERT(devExt->signature == DEVICE_EXTENSION_SIGNATURE);
    >
    > irpSp = IoGetCurrentIrpStackLocation(Irp);
    >
    > /*
    > * Get major/minor function codes in private variables
    > * so we can access them after the IRP is completed.
    > */
    > majorFunc = irpSp->MajorFunction;
    > minorFunc = irpSp->MinorFunction;
    > FileObject = irpSp->FileObject;
    > OutputBuffer=Irp->AssociatedIrp.SystemBuffer;
    >
    > DBGOUT(("VA_Dispatch: majorFunc=%d, minorFunc=%d",
    > (ULONG)majorFunc, (ULONG)minorFunc));
    >
    > /*
    > * For all IRPs except REMOVE, we increment the PendingActionCount
    > * across the dispatch routine in order to prevent a race condition with
    > * the REMOVE_DEVICE IRP (without this increment, if REMOVE_DEVICE
    > * preempted another IRP, device object and extension might get
    > * freed while the second thread was still using it).
    > */
    > if (!((majorFunc == IRP_MJ_PNP) && (minorFunc == IRP_MN_REMOVE_DEVICE))){
    > IncrementPendingActionCount(devExt);
    > }
    >
    > if ((majorFunc != IRP_MJ_PNP) &&
    > (majorFunc != IRP_MJ_CLOSE) &&
    > ((devExt->state == STATE_REMOVING) oror
    > (devExt->state == STATE_REMOVED))){
    >
    > /*
    > * While the device is being removed,
    > * we only pass down the PNP and CLOSE IRPs.
    > * We fail all other IRPs.
    > */
    > status = Irp->IoStatus.Status = STATUS_DELETE_PENDING;
    > IoCompleteRequest(Irp, IO_NO_INCREMENT);
    > passIrpDown = FALSE;
    > }
    > else {
    >// KeAcquireSpinLock( &CountMutex, &oldirql );
    > switch (majorFunc){
    >
    > case IRP_MJ_PNP:
    > status = VA_PnP(devExt, Irp);
    > passIrpDown = FALSE;
    > break;
    >
    > case IRP_MJ_POWER:
    > status = VA_Power(devExt, Irp);
    > passIrpDown = FALSE;
    > break;
    >
    > case IRP_MJ_READ:
    > if(devExt->bAccess == FALSE){
    > status = Irp->IoStatus.Status = STATUS_UNSUCCESSFUL ;
    > IoCompleteRequest(Irp, IO_NO_INCREMENT);
    > passIrpDown = FALSE;
    > }
    > if ( !(Irp->Flags & IRP_NOCACHE) )
    > break;
    >
    > // 메모리 버퍼 포인터를 얻음
    > if ( Irp->MdlAddress )
    > {
    > // 실질적인 데이터가 들어갈 System Buffer 주소 얻음
    > Buffer = MmGetSystemAddressForMdl( Irp->MdlAddress );
    > }
    > else if( Irp->AssociatedIrp.SystemBuffer )
    > {
    > Buffer = Irp->AssociatedIrp.SystemBuffer;
    > }
    > else
    > {
    > Buffer = Irp->UserBuffer;
    > }
    >
    > FcbHeader = (PFSRTL_COMMON_FCB_HEADER)irpSp->FileObject->FsContext;
    >
    > // 파일의 총 길이를 구함
    > TotalFileSize = FcbHeader->FileSize.LowPart;
    >
    > // 현 block의 암호화할 File Size를 읽는다.
    > currentBlockFileSize = Irp->IoStatus.Information;
    >
    > // 현재의 블럭의 파일 사이즈와 전체 파일 사이즈를 비교
    > if (currentBlockFileSize >= TotalFileSize)
    > {
    > // 전체 파일 사이즈만큼 데이터 복호화
    > // DecryptionData (Buffer, TotalFileSize);
    > }
    > else
    > {
    > // 현 block의 크기만큼 파일 복호화
    > // DecryptionData (Buffer, currentBlockFileSize);
    > }
    >
    > break;
    > case IRP_MJ_WRITE :
    > if ( !(Irp->Flags & IRP_NOCACHE) )
    > break;
    >
    > DbgPrint(" Write Start\n");
    >
    > if ( Irp->MdlAddress )
    > {
    >
    > // 실질적인 데이터가 들어갈 System Buffer 주소 얻음
    > Buffer = MmGetSystemAddressForMdlSafe( Irp->MdlAddress,HighPagePriority );
    > }
    > else if( Irp->AssociatedIrp.SystemBuffer )
    > {
    >
    > Buffer = Irp->AssociatedIrp.SystemBuffer;
    >
    > }
    > else
    > {
    >
    > Buffer = Irp->UserBuffer;
    > DbgPrint(" Buffer Enter!!\n");
    > }
    >
    > FcbHeader = (PFSRTL_COMMON_FCB_HEADER)irpSp->FileObject->FsContext;
    >
    > // 파일의 총 길이를 구함
    > TotalFileSize = FcbHeader->FileSize.LowPart;
    >
    > // 현 block의 암호화할 File Size를 읽는다.
    > currentBlockFileSize = irpSp->Parameters.Write.Length;
    >
    > // 현재의 블럭의 파일 사이즈와 전체 파일 사이즈를 비교
    > if (currentBlockFileSize >= TotalFileSize)
    > {
    > // 전체 파일 사이즈만큼 데이터 암호화
    > EncryptionData (Buffer, TotalFileSize);
    > DbgPrint(" Secu ing!!!!\n");
    > }
    > else
    > {
    > // 현 block의 크기만큼 파일 암호화
    > EncryptionData (Buffer, currentBlockFileSize);
    > DbgPrint(" Secu ing!!!!\n");
    > }
    > break;
    >
    > case IRP_MJ_DEVICE_CONTROL:
    > {
    > if( Irp->MdlAddress )
    > {
    > OutputBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress );
    > }
    > ioControlCode = irpSp->Parameters.DeviceIoControl.IoControlCode;
    > if(ioControlCode == IOCTL_ACCESS_OK){
    > devExt->bAccess = TRUE;
    > status = Irp->IoStatus.Status = STATUS_SUCCESS;
    > IoCompleteRequest(Irp, IO_NO_INCREMENT);
    > passIrpDown = FALSE;
    > break;
    > }
    > else if(ioControlCode == IOCTL_DO_NOT_ACCESS){
    > devExt->bAccess = FALSE;
    > status = Irp->IoStatus.Status = STATUS_SUCCESS;
    > IoCompleteRequest(Irp, IO_NO_INCREMENT);
    > passIrpDown = FALSE;
    > break;
    > }
    > break;
    > }
    >
    >
    > case IRP_MJ_CREATE:
    > case IRP_MJ_CLOSE:
    > case IRP_MJ_SYSTEM_CONTROL:
    > case IRP_MJ_INTERNAL_DEVICE_CONTROL:
    > default:
    > /*
    > * For unsupported IRPs, we simply send the IRP
    > * down the driver stack.
    > */
    > break;
    > }
    >// KeReleaseSpinLock( &CountMutex, oldirql );
    > }
    >
    > if (passIrpDown){
    > IoCopyCurrentIrpStackLocationToNext(Irp);
    > status = IoCallDriver(devExt->topDevObj, Irp);
    > }
    > /*
    > * Balance the increment to PendingActionCount above.
    > */
    > if (!((majorFunc == IRP_MJ_PNP) && (minorFunc == IRP_MN_REMOVE_DEVICE))){
    > DecrementPendingActionCount(devExt);
    > }
    > return status;
    >}
    >
    >전체소스도필요하시면 올리겠습니다..제발 도움좀 주세요 ㅠㅠ.. 그래서 지금 IRP부분을 다시보고 있습니다
    >조언주심감사하겠습니다 꾸벅 __)

제목 날짜
mouclass 접근.. 3 2010.03.13
class callback호출시 에러가 나는데 뭐가 문제인지 모르겠습니다..ㅠㅠ 1 2006.07.22
[TIP] NEXUS(넥서스) 5x 루팅 방법입니다. 2016.01.05
mouclass 접근.. 3 2010.03.13
class callback호출시 에러가 나는데 뭐가 문제인지 모르겠습니다..ㅠㅠ 1 2006.07.22
[TIP] NEXUS(넥서스) 5x 루팅 방법입니다. 2016.01.05
USB Keyboard Filter Driver 제작 관련... 1 2006.11.22
운영체제에서 "철학자들의 만찬" 알고리즘에 대해.. 1 2004.06.04
실시간 동작감지 앱 - 추태(안드로이드용) 2011.05.29
https 패킷 디버깅 5 2012.04.30
"pc용 dos의 설계 및 구현" 책의 diskette 화일을 구합니다. 1 2009.11.10
Soft ICE 기존 사용법 및 내용추가 2002.02.25
먼 길을 따라.. 1 2009.12.21
플로피 필터 드라이버 관련 질문입니다..답변좀해주세요.. 2 2006.12.12
터치스크린 - 마우스제어 2 2010.03.10
os를 공부하고 있습니다. 1 2009.12.14
[펌]Sony vegas - 영상의 객체를 따라다니는 텍스트 효과(Sony Vegas Motion Tracking Text) 2015.06.02
PC의 메모리 맵 정보 1 2007.04.24
inf 파일을 이용한 드라이버 자동 설치 2 2003.09.23
GSector 플로피->하드로 쓰기가 가능한가요? 1 2007.01.26
드라이버의 로딩순서 바꾸기가 가능한가요. 1 2004.08.17
데브피아에 글을올린 김태완입니다. 2003.08.21
GUNClient Download Control 질문 1 2007.06.08
태그 목록
위로