메뉴 건너뛰기

그외 개발정보


안녕하세요 현 대학교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부분을 다시보고 있습니다
조언주심감사하겠습니다 꾸벅 __)




번호 제목 글쓴이 날짜 조회 수
공지 [TIP] NEXUS(넥서스) 5x 루팅 방법입니다. 파이팅건맨 2016.01.05 3213
공지 mouclass 접근.. [3] 구리 2010.03.13 3047
공지 class callback호출시 에러가 나는데 뭐가 문제인지 모르겠습니다..ㅠㅠ [1] 나원오 2006.07.22 3046
124 [TIP] NEXUS(넥서스) 5x 루팅 방법입니다. 파이팅건맨 2016.01.05 3213
123 mouclass 접근.. [3] 구리 2010.03.13 3047
122 class callback호출시 에러가 나는데 뭐가 문제인지 모르겠습니다..ㅠㅠ [1] 나원오 2006.07.22 3046
121 [TIP] 라즈베리파이 3를 AP로 만들기 (How to make Raspberry Pi 3 to Access point device) 파이팅건맨 2018.01.22 2756
120 USB Keyboard Filter Driver 제작 관련... [1] 나원오 2006.11.22 2599
119 운영체제에서 "철학자들의 만찬" 알고리즘에 대해.. [1] 정준욱 2004.06.04 2246
118 실시간 동작감지 앱 - 추태(안드로이드용) 파이팅건맨 2011.05.29 2242
117 https 패킷 디버깅 [5] ChazEpps 2012.04.30 2116
116 [TIP] CentOS 7에 MySql 5.7 설치 & 업그레이드 하기 파이팅건맨 2017.11.15 2071
115 [펌]Sony vegas - 영상의 객체를 따라다니는 텍스트 효과(Sony Vegas Motion Tracking Text) 파이팅건맨 2015.06.02 2062
114 "pc용 dos의 설계 및 구현" 책의 diskette 화일을 구합니다. [1] 주하 2009.11.10 1960
113 Soft ICE 기존 사용법 및 내용추가 파이팅건맨 2002.02.25 1941
» 플로피 필터 드라이버 관련 질문입니다..답변좀해주세요.. [2] 백종경 2006.12.12 1879
111 먼 길을 따라.. [1] 최상훈 2009.12.21 1875
110 터치스크린 - 마우스제어 [2] 구리 2010.03.10 1836
109 inf 파일을 이용한 드라이버 자동 설치 [2] 안민선 2003.09.23 1772
108 os를 공부하고 있습니다. [1] 김제영 2009.12.14 1673
107 [TIP] MAC에 wget설치가 잘 되지 않을때 파이팅건맨 2016.02.25 1548
106 PC의 메모리 맵 정보 [1] 파이팅건맨 2007.04.24 1542
105 드라이버의 로딩순서 바꾸기가 가능한가요. [1] 양혁 2004.08.17 1513
위로