makefriend8
驱动小牛
驱动小牛
  • 注册日期2003-08-01
  • 最后登录2014-06-27
  • 粉丝0
  • 关注0
  • 积分84分
  • 威望111点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:1240回复:2

俺也写点入门的东东。(主要是代码了)

楼主#
更多 发布于:2005-03-13 10:22
以下是某位大大的代码,我只是转一下了。
算是最简单的WDM驱动吧!
当然是啥都没干。而且应用程序的接口暂时也用符号名连接了。
如何运行?大家查一下动态装载驱动程序就可以看到应用程序的代码了。不用安装,直接运行那个应用程序就OK了。
build一下可以生成SYS了。
俺只是给程序加了点注释。
#include <ntddk.h>

#define NT_DEVICE_NAME L\"\\Device\\Twdm1\"
#define DOS_DEVICE_NAME L\"\\DosDevices\\Twdm1\"

NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath );
NTSTATUS DispatchCreate(PDEVICE_OBJECT fdo, PIRP Irp);
NTSTATUS DispatchClose(PDEVICE_OBJECT fdo, PIRP Irp);
VOID GpdUnload(PDRIVER_OBJECT DriverObject);

//////////////////////
PDEVICE_OBJECT fdo;
BOOLEAN fSymbolicLink;

//把这个函数看成main就行了
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )
{

//UNREFERENCED_PARAMETER (RegistryPath);
NTSTATUS status;
UNICODE_STRING ntDeviceName;
UNICODE_STRING win32DeviceName;
//这个东东可以用driver moniter看了。
DbgPrint( \"TWDM: DriverEntry for Twdm.sys ...... n\" );
fSymbolicLink = FALSE;

//
// Create dispatch points for the IRPs.
//
//支持PnP的任何驱动程序必须拥有AddDevice例程。俺这是意思,就
//先不支持了。
//驱动程序能定义若干Dispatch入口点,但是它只能在其驱动程序对
//象中定义一个StartIo入口点、一个AddDevice入口点,和一个
//Unload入口点。
DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
//如果驱动程序能动态地被装载和/或者替换,还需要一个Unload入
//口点,从而可以释放任何系统资源,诸如驱动程序已分配的系统对
//象或者内存当系统运行时不能被替换的驱动程序,诸如键盘驱动程
//序,不必提供Unload例程

DriverObject->DriverUnload = GpdUnload;
//初始化设备名了,我觉的把他理解成strcpy就可以了。当然。
//这儿得考虑全球统一编码啥的。俺也晕的。
RtlInitUnicodeString(&ntDeviceName, NT_DEVICE_NAME);
//创建设备
//如果最低层驱动程序被设计成创建并且管理它自己的IRP队列,它
//不必定义StartIo入口点。然而,大多数这样驱动程序在它们的驱
//动程序对象中定义StartIo入口点,并且依靠I/O管理器为发往它们
//的StartIo例程的IRP排队,现在的做法就叫做大多数。
status = IoCreateDevice(DriverObject,
0,
&ntDeviceName,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&fdo);

if (!NT_SUCCESS (status))
{
DbgPrint( \"TWDM: IoCreateDevice() faild ! n\" );
}
else
{
DbgPrint( \"TWDM: IoCreateDevice() ok ! n\" );
//又搞了个win32设备名,也就是为了下面这个函数要用了)
RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME);

//创建符号连接
status = IoCreateSymbolicLink( &win32DeviceName, &ntDeviceName );
if (!NT_SUCCESS(status))
{
DbgPrint( \"TWDM: IoCreateSymbolicLink() faild ! n\" );
}
else
{
DbgPrint( \"TWDM: IoCreateSymbolicLink() ok ! n\" );
fSymbolicLink = TRUE;
}
fdo->Flags &= ~DO_DEVICE_INITIALIZING;
}

if (!NT_SUCCESS(status))
{
if(fdo)
{
IoDeleteDevice(fdo);
}
if(fSymbolicLink)
{
IoDeleteSymbolicLink(&win32DeviceName);
}
}
return status;
}
//这个就是驱动打开的时候运行了,可以认为CreateFile的时候调用
NTSTATUS DispatchCreate(PDEVICE_OBJECT fdo, PIRP Irp)
{
NTSTATUS status;
DbgPrint( \"TWDM: IRP_MJ_CREATE for Twdm.sys ...... n\" );
status = STATUS_SUCCESS;
return status;
} // DispatchCreate
//驱动关闭的时候运行了。可以认为CloseHandle时候调用
NTSTATUS DispatchClose(PDEVICE_OBJECT fdo, PIRP Irp)
{ // DispatchClose
NTSTATUS status;
DbgPrint( \"TWDM: IRP_MJ_CLOSE for Twdm.sys ...... n\" );
status = STATUS_SUCCESS;
return status;
} // DispatchClose
//这个前面都说了,卸载驱动的时候才调用了。
VOID GpdUnload(PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING win32DeviceName;

DbgPrint( \"TWDM: GpdUnload() for Twdm.sys ...... n\" );
//搞这个拷贝也是后面的函数要用了。
RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME);
if(fdo)
{
IoDeleteDevice(fdo);
}
if(fSymbolicLink)
{
IoDeleteSymbolicLink(&win32DeviceName);
}
}
makefriend8
驱动小牛
驱动小牛
  • 注册日期2003-08-01
  • 最后登录2014-06-27
  • 粉丝0
  • 关注0
  • 积分84分
  • 威望111点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-13 10:42
可执行程序还是贴一下吧!,俺觉的奇怪,
为什么,C程序build没问题,C++程序build 就一堆问题呢?
驱动程序不允许用类???没办法啊!
差点忘了。得贴一下sources,,呵呵,虽然没啥内容
TARGETNAME=Twdm
TARGETPATH=Debug
TARGETTYPE=DRIVER
C_DEFINES=$(C_DEFINES)
INCLUDES=
SOURCES= T.c

接着得改进改进这个简单的驱动了。
附件名称/大小 下载次数 最后更新
2005-03-13_twdm.cpp (5KB)  6
makefriend8
驱动小牛
驱动小牛
  • 注册日期2003-08-01
  • 最后登录2014-06-27
  • 粉丝0
  • 关注0
  • 积分84分
  • 威望111点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-13 11:07
现在完整一点。差点忘了。。一开始贴的是别人的。好象有点问题的
#define NT_DEVICE_NAME L\"\\\\Device\\\\Twdm1\"
#define DOS_DEVICE_NAME L\"\\\\DosDevices\\\\Twdm1\"
这样就OK了。

昏,,好象有些地方写错了。。

昏。。成废贴了。

等会在发了。。我先看下文档
游客

返回顶部