jamw
驱动牛犊
驱动牛犊
  • 注册日期2002-08-03
  • 最后登录2002-08-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:867回复:1

[问题]WDM 新手的第一个程式

楼主#
更多 发布于:2002-08-14 11:19
依书上范例 ( 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;
}
======================
zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-14 12:46
先确认你的驱动是否已经正确安装!
nice
游客

返回顶部