注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

DeviceIoControl与NtDeviceIoControlFile以及调试  

2013-02-19 16:11:41|  分类: 调试记录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

DeviceIoControl函数如下:

BOOL DeviceIoControl(
  HANDLE hDevice,              // handle to device of interest
  DWORD dwIoControlCode,       // control code of operation to perform
  LPVOID lpInBuffer,           // pointer to buffer to supply input data
  DWORD nInBufferSize,         // size, in bytes, of input buffer
  LPVOID lpOutBuffer,          // pointer to buffer to receive output data
  DWORD nOutBufferSize,        // size, in bytes, of output buffer
  LPDWORD lpBytesReturned,     // pointer to variable to receive byte count
  LPOVERLAPPED lpOverlapped    // pointer to structure for asynchronous operation
);

 

NtDeviceIoControlFile函数如下:
NTSTATUS WINAPI NtDeviceIoControlFile(
  _In_   HANDLE FileHandle,
  _In_   HANDLE Event,
  _In_   PIO_APC_ROUTINE ApcRoutine,
  _In_   PVOID ApcContext,
  _Out_  PIO_STATUS_BLOCK IoStatusBlock,
  _In_   ULONG IoControlCode,
  _In_   PVOID InputBuffer,
  _In_   ULONG InputBufferLength,
  _Out_  PVOID OutputBuffer,
  _In_   ULONG OutputBufferLength
);

 

从上面可以看到,红色部分是一模一样。后者更底层一些。

调试一下看看过程。

调试记事本

cdb notepad.exe

先看一下kernel32!DeviceIoControl的调用关系

0:000> uf /c kernel32!DeviceIoControl
kernel32!DeviceIoControl (7c801629)
  kernel32!DeviceIoControl+0x7 (7c801630):
    call to kernel32!ReleaseMutex+0x1f (7c8024d6)
  kernel32!DeviceIoControl+0x46 (7c80166f):
    call to ntdll!NtDeviceIoControlFile (7c92d27e)
  kernel32!DeviceIoControl+0x6a (7c801693):
    call to kernel32!ReleaseMutex+0x5a (7c802511)
  kernel32!DeviceIoControl+0x93 (7c8016bc):
    call to ntdll!NtDeviceIoControlFile (7c92d27e)
  kernel32!DeviceIoControl+0xcb (7c8016f4):
    call to kernel32!GetTickCount+0xcf (7c809419)
  kernel32!DeviceIoControl+0xe5 (7c80170e):
    call to ntdll!NtFsControlFile (7c92d39e)
  kernel32!DeviceIoControl+0x10c (7c801735):
    call to ntdll!ZwWaitForSingleObject (7c92df4e)
  kernel32!DeviceIoControl+0x11e (7c801747):
    call to ntdll!NtFsControlFile (7c92d39e)

从调用关系里可以看到主要有两个函数

ntdll!NtDeviceIoControlFile

ntdll!NtFsControlFile

这两个函数反汇编如下

0:000> uf ntdll!NtDeviceIoControlFile
ntdll!NtDeviceIoControlFile:
7c92d27e b842000000      mov     eax,42h
7c92d283 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c92d288 ff12            call    dword ptr [edx]
7c92d28a c22800          ret     28h

0:000> uf ntdll!NtFsControlFile
ntdll!NtFsControlFile:
7c92d39e b854000000      mov     eax,54h
7c92d3a3 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c92d3a8 ff12            call    dword ptr [edx]
7c92d3aa c22800          ret     28h

而7ffe0300的内容为

0:000> dds 7ffe0300 l1
7ffe0300  7c92e510 ntdll!KiFastSystemCall
0:000> uf ntdll!KiFastSystemCall
ntdll!KiFastSystemCall:
7c92e510 8bd4            mov     edx,esp
7c92e512 0f34            sysenter
7c92e514 c3              ret

所以这两个函数已经非常底层了。

继续调试看看,下断点bp kernel32!DeviceIoControl运行

先pt一下看一下这个函数参数个数

kernel32!DeviceIoControl:
7c801629 6a14            push    14h
0:001> pt
kernel32!DeviceIoControl+0x6f:
7c801698 c22000          ret     20h

从ret 20h可知DeviceIoControl参数个数为8个

同样方法

ntdll!NtDeviceIoControlFile:
7c92d27e b842000000      mov     eax,42h
0:000> pt
ntdll!NtDeviceIoControlFile+0xc:
7c92d28a c22800          ret     28h

从ret 28h可知NtDeviceIoControlFile参数个数为10个

再看一下这两个函数参数的内容,两个函数都在开头中断后查看堆栈内容。

kernel32!DeviceIoControl:
7c801629 6a14            push    14h
0:000> dd esp
0007f66c  77da9559 【000007ac 00390008 77e16318
0007f67c  00000100 0007f700 00000100 0007f6f8
0007f68c  00000000】 77e162f8 0007f818 00000018

ntdll!NtDeviceIoControlFile:
7c92d27e b842000000      mov     eax,42h
0:000> dd esp
0007f60c  7c801675 【000007ac 00000000 00000000
0007f61c  00000000 0007f644 00390008 77e16318
0007f62c  00000100 0007f700 00000100】 00000000

从上面的堆栈可以看到,相同颜色的部分都是一样的内容!

最后做2张图片,红色和蓝色部分是一样的。DeviceIoControl与NtDeviceIoControlFile以及调试 - appall - 且行且记录

 

DeviceIoControl与NtDeviceIoControlFile以及调试 - appall - 且行且记录
  评论这张
 
阅读(3151)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017