阅读:867回复:1
[问题]WDM 新手的第一个程式
依书上范例 ( Developing Windows NT Device Drivers )
做出了 hello.sys 在registry中设定 \\register\\machine\\system\\currentcontrolset\\services\\HELLO Type = REG_DWORD 0x00000001 Start = REG_DWORD 0x00000003 Group = Extended base ErrorControl = REG_DWORD 0x00000001 写个测试程式, 也是书上范例, 却出现 Can\'t get a handle to HELLO device 是测试程式印出的讯息. 请问各位先进, 我是那里出错呢? 以下是程式码 hello.c =================================================== #include \"ntddk.h\" #include \"hello.h\" #define NT_DEVICE_NAME L\"\\\\Device\\\\HELLO\" #define DOS_DEVICE_NAME L\"\\\\DosDevice\\\\HELLO\" NTSTATUS HelloOpen( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS HelloClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); VOID HelloUnload( IN PDRIVER_OBJECT DriverObject); NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegisteryPath) { PDEVICE_OBJECT DeviceObject = NULL; NTSTATUS status; UNICODE_STRING NtNameString; UNICODE_STRING Win32NameString; KdPrint( (\"HELLO: ENter the HELLO driver!\\n\") ); RtlInitUnicodeString( &NtNameString, NT_DEVICE_NAME ); status = IoCreateDevice( DriverObject, 0, &NtNameString, FILE_DEVICE_UNKNOWN, 0, FALSE, &DeviceObject ); if ( NT_SUCCESS(status) ) { DriverObject->MajorFunction[IRP_MJ_CREATE] = HelloOpen; DriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloClose; DriverObject->DriverUnload = HelloUnload; KdPrint( (\"HELLO: just about ready!\\n\") ); RtlInitUnicodeString( &Win32NameString, DOS_DEVICE_NAME ); status = IoCreateSymbolicLink( &Win32NameString, &NtNameString ); if( !NT_SUCCESS(status) ) { KdPrint((\"HELLO: Couldn\'t creat the symbolic link!\\n\")); IoDeleteDevice( DriverObject->DeviceObject ); } else { KdPrint((\"HELLO: All initialized!\\n\")); } } else { KdPrint((\"HELLO: Couldn\'t creat the device\\n\")); } return status; } NTSTATUS HelloOpen( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { KdPrint((\"HELLO: Opened\\n\")); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT) ; return STATUS_SUCCESS; } NTSTATUS HelloClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { KdPrint((\"HELLO: Closed\\n\")); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT) ; return STATUS_SUCCESS; } VOID HelloUnload( IN PDRIVER_OBJECT DriverObject) { UNICODE_STRING Win32NameString; KdPrint((\"HELLO: Unloading\\n\")); RtlInitUnicodeString( &Win32NameString, DOS_DEVICE_NAME ); IoDeleteSymbolicLink( &Win32NameString ); IoDeleteDevice( DriverObject->DeviceObject ); } ======================= hello.h ====================== #define HELLO_SIZE 4096 #define HELLO_BUSADDERS 0X1C0010000 #define HELLO_BUSADDRESS_HIGH 0X1C0011FE0 #define HELLO_CSR_BUSADDRESS 0X1C0018000 #define HELLO_PAGESIZE 256 #define HELLO_BUSNUMBER 0X1 ========================== test.c ======================== #include \"windows.h\" #include \"stdio.h\" HANDLE hTest; int main(int argc, char **argv) { hTest = CreateFile( \"\\\\\\\\. \\\\HELLO\", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if ( hTest != INVALID_HANDLE_VALUE ) { printf(\"Wow - CreatFile readlly worked!!\\n\"); CloseHandle(hTest); } else { printf(\"Can\'t get a handle to HELLO device\\n\"); } return 0; } ====================== |
|
沙发#
发布于:2002-08-14 12:46
先确认你的驱动是否已经正确安装!
|
|
|