操作驱动程序、与驱动程序通信

RLib 2010-12-27 09:49:00

.子程序 通信, 逻辑型, 公开, 操作驱动程序
.参数 驱动控制码, 整数型, , 与驱动程序通信的控制码,十进制
.参数 输入指针, 整数型, 可空, 欲输入数据的指针,可留空
.参数 输入指针长度, 整数型, 可空, 默为0,不指定长度
.参数 输出指针, 整数型, 可空, 欲输出数据的指针,可留空
.参数 输出指针长度, 整数型, 可空, 默为0,不指定长度


上面是易语言的驱动通信操作的声明代码,现翻译成Native C++


首先,调用NtLoadDriver成功加载了驱动(名称:"ialdnwxf",地址:"\\??\\C:\\Documents and Settings\\Administrator\\Local Settings\\Temp\\sbtx.sys",注册:"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\ialdnwxf")

接着,如何与驱动通信呢?(驱动操作码:0x00222005)

貌似使用NtDeviceIoControlFile,但不知第一个参数HANDLE如何获得?NtCreateFile获取的HANDLE用在这里好像不行,MSDN上没有相关例程.

调用NtUnloadDriver成功卸载.
...全文
175 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
RLib 2011-01-02
  • 打赏
  • 举报
回复
解决。
RLib 2010-12-31
  • 打赏
  • 举报
回复
有人吗?
mszjk 2010-12-28
  • 打赏
  • 举报
回复
sb tx
RLib 2010-12-28
  • 打赏
  • 举报
回复
汗,我没有回答啊!那代码是补充
用户 昵称 2010-12-28
  • 打赏
  • 举报
回复
自己回答了
RLib 2010-12-27
  • 打赏
  • 举报
回复

//初始化
UNICODE_STRING UNI_STR,UNI_STR_2;
RtlInitUnicodeString(&UNI_STR,T("\\Registry\\Machine\\System\\CurrentControlSet\\Services\\ialdnwxf"));
//加载驱动程序
if(!NtLoadDriver(&UNI_STR))
{
MessageBoxA(0,"加载成功!","Err",0);
}
else
{
show_err();
}
//获取驱动句柄HANDLE
OBJECT_ATTRIBUTES OA = {0};
RtlInitUnicodeString(&UNI_STR_2,T("\\\\.\\ialdnwxf"));
InitializeObjectAttributes(&OA,&UNI_STR_2,0x00000200/*OBJ_KERNEL_HANDLE*/,NULL,NULL);
HANDLE hDriver = NULL;
IO_STATUS_BLOCK ISB = {0};
if(!NtCreateFile(&hDriver,GENERIC_READ|GENERIC_WRITE,&OA,&ISB,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ|FILE_SHARE_WRITE,0x00000003/*FILE_OPEN_IF*/,NULL,NULL,NULL))
{
MessageBoxA(0,"获取驱动句柄成功!","Err",0);
}
else
{
show_err();//此处显示错误 C000003B STATUS_OBJECT_PATH_SYNTAX_BAD
}
//与驱动通信
ULONG InputBuffer=0,OutputBuffer=0;
if (!NtDeviceIoControlFile(hDriver,NULL,NULL,&ISB,&ISB,0x00222005/*IoControlCode is 2236421*/,&InputBuffer,sizeof(InputBuffer),/*&OutputBuffer*/0,/*sizeof(OutputBuffer)*/0))
{
MessageBoxA(0,"操作成功!","Err",0);
}
else
{
show_err();//此处显示错误C0000008 STATUS_INVALID_HANDLE
}
if(!NtUnloadDriver(&UNI_STR))
{
MessageBoxA(0,"卸载驱动成功!","Err",0);
}
else
{
show_err();
}
RtlFreeUnicodeString(&UNI_STR);
NtClose(hDriver);
dyk_x 2010-12-27
  • 打赏
  • 举报
回复
先用用NtCreateFile获得设备文件的句柄(HANDLE),然后调用NtDeviceIoControlFile时使用设备文件的句柄。设备文件名应该是你写驱动时创建的,不一定是“sbtx.sys”。

2,641

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧