Visual Studio 2015(C#)
要调用Win32 API,首先要知道API中的参数怎么用。因为使用C编程时,在头文件winnt.h中声明有Win32 API需要的常量,可是C#的编程环境中是没有的,因此我们可以从这个头文件查看常匠耻量,然后自己写uint类型枚举如图,代替C/C++中的宏定义。
第一个用到的函数:CreateFile上边几个就是CreateFile函数往裁改需要用到的常量。uint类型的枚举可以直接代替uint类型作为传入参数。
第二个用到的函数:SetFilePointer使用CreateFile创建句柄后,用这个设置读指针位置。如图的MoveMethodMode就是自己定义的uint类型枚举常量。引用变量写成[In, Out] ref...SetLastError属性则可有可无,设置这个是为了能够在失败时获取Win32错误。
第三个/第四个用到的函数:ReadFile,CloseHandle。分别用来读取,和关闭句柄。
首先如图调用CreateFile,各个参数如图设置即可。如果diskHandle得到-1,就是创建失败,弹窗娃佛显示(显示信息有小问题,是不是\\.\PHYSICALDRIVE0取决于调用函数者)
然后从sector计算文件指针的第32位和高32位。使用SetFilePointer设置指针位置。
如果返回0xffffffff,就说明设置失败,返回。如果成功,继续,调用ReadFile读取内容到缓冲区。然后关闭句柄,返回读取成功。
然后我们在事件处理函数中,就可以如图读取扇区,接着格式化并显示出来。
直接运行可能失败,我们需要开启这个程序的管理员权限要求。这里简单说明如图,若有问题请查阅别处。
接下来,我们把自己写的读盘程序,和一些现有软件做比较,可以看到读取结果正确。
关于以上几个Win32 API的详细用法,可以查阅别处,这篇经验的重点在于如何在C#中使用它们。
使用DllImport只能引入方法,而且写在自己的类内,成为类的成员。