ZwCreateFile() 이 실패하는 이유..
오늘 참... 어이없는 삽질을 했습니다. (사실 요즘 삽질의 연속이긴합니다만 ㅠ.ㅠ )
아주 간단한 드라이버를 두개를 작성하고, 하나의 드라이버에서 다른 드라이버를 오픈하는 코드를 작성했지요.

오픈의 대상이 되는 드라이버의 코드는 아래와 같고요.. 빌드해서 로드하면 \Device\Callee 오브젝트를 만듭니다.
참고로.. 아래 코드에서 "중간생략" 된 코드는 없고, 컴파일 되는 코드 그대로입니다. :-)

extern "C"
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
KdPrint( (CALLEE_CALLEE_DRIVER_NAME" %s \n", __FUNCTION__) );

// device 생성
//
PDEVICE_OBJECT DeviceObject = NULL;
UNICODE_STRING DeviceName;
RtlInitUnicodeString(&DeviceName, L"\\Device\\Callee");
NTSTATUS status = IoCreateDevice(
DriverObject,
sizeof(DEVICE_EXTENSION),
&DeviceName,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
TRUE,
&DeviceObject
);
if (FALSE == NT_SUCCESS(status))
{
KdPrint( (CALLEE_CALLEE_DRIVER_NAME" IoCreateDevice(), status=0x%08x \n", status) );
return status;
}

// initialize MajorFunctions
//
DriverObject->DriverUnload = Unload;

return STATUS_SUCCESS;
}


Callee 드라이버를 오픈하는 드라이버의 코드는 아래와 같습니다.


extern "C"
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
KdPrint( (CALLER_CALLEE_DRIVER_NAME" %s \n", __FUNCTION__) );

NTSTATUS status=STATUS_UNSUCCESSFUL;

DriverObject->DriverUnload = Unload;

// Open Callee device
//
HANDLE hCallee = NULL;
IO_STATUS_BLOCK iostatus;
OBJECT_ATTRIBUTES oa;
UNICODE_STRING uCalleeDeviceName;
RtlInitUnicodeString(&uCalleeDeviceName, L"\\Device\\Callee");
InitializeObjectAttributes(
&oa,
&uCalleeDeviceName,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL,
NULL);
status = ZwCreateFile(
&hCallee,
GENERIC_ALL,
&oa,
&iostatus,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ | FILE_SHARE_WRITE/*| FILE_SHARE_DELETE*/,
FILE_OPEN_IF,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0
);
if(!NT_SUCCESS(status))
{
KdPrint((
"%s, ZwCreateFile(%wZ) failed, status=0x%08x \n",
__FUNCTION__, &uCalleeDeviceName, status
));
return status;
}

// Close Callee device
//
ZwClose(hCallee);

return STATUS_SUCCESS;
}
당연히 잘 되겠지 했는데 계속 ZwCreateFile() 함수가 오류를 뱉어내더군요.ㅜㅜ
WinObj 로 봐도 분명히 \Device\Callee 가 만들어져 있는데도요..
별의 별짓을 다 하다.. 갑자기 아차차~!!! 싶더군요.

대체 왜 ZwCreateFile() 이 에러를 뱉어냈을까요?? 퀴즈입니다!!~!

답은 아래에 있습니다.




































정답 나갑니다. :-)
ZwCreateFile()  이 실패했던 이유는 Create 핸들러가 없어서 그렇습니다. -_-;;
이러니 Open 이 안되는것이겠죠. ㅎㅎ 간단하죠?
코드를 작성할때 대부분 기존 사용하던 템플릿 코드를 그대로 재사용하기 때문에 이런 어처구니 없는 실수를 하게 만드는것 같습니다. 




NTSTATUS __stdcall DispatchCreateClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);

/** ---------------------------------------------------------------------------
\brief

\param
\return
\code
\endcode
-----------------------------------------------------------------------------*/
extern "C"
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
KdPrint( (CALLEE_CALLEE_DRIVER_NAME" %s \n", __FUNCTION__) );

// device 생성
//
PDEVICE_OBJECT DeviceObject = NULL;
UNICODE_STRING DeviceName;
RtlInitUnicodeString(&DeviceName, L"\\Device\\Callee");
NTSTATUS status = IoCreateDevice(
DriverObject,
sizeof(DEVICE_EXTENSION),
&DeviceName,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
TRUE,
&DeviceObject
);
if (FALSE == NT_SUCCESS(status))
{
KdPrint( (CALLEE_CALLEE_DRIVER_NAME" IoCreateDevice(), status=0x%08x \n", status) );
return status;
}

// initialize MajorFunctions
//
DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreateClose;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateClose;
DriverObject->DriverUnload = Unload;

return STATUS_SUCCESS;
}

/** ---------------------------------------------------------------------------
\brief 제가 범인이랍니다. ^^

\param
\return
\code
\endcode
-----------------------------------------------------------------------------*/
NTSTATUS __stdcall DispatchCreateClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
UNREFERENCED_PARAMETER(DeviceObject);
KdPrint( (CALLEE_CALLEE_DRIVER_NAME" %s \n", __FUNCTION__) );


// complete this irp !
//
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}



by somma | 2009/08/13 22:16 | 시스템 프로그래밍 | 트랙백 | 덧글(9)


< 이전페이지 다음페이지 >