阅读:1816回复:2
C++ 载入驱动的问题,对会的来说简单,急,都来看看吧
有一段VB调用驱动的代码,
它的主函数入口是: Dim c_Drv As New cls_Driver Sub Main() With c_Drv .szDrvFilePath = App.path & "\mydriver.sys" .szDrvLinkName = "NewPine" .szDrvSvcName = "NewPine" .szDrvDisplayName = "NewPine" .InstDrv .StartDrv .OpenDrv Dim path As String path = "\??\" & "C:\Program Files\MSBuild\ndt.exe" c_Drv.IoControl 2231680, VarPtr(path), 4, 0, 0 End With End Sub ===== 其中 cls_Driver 这是个类,加载驱动什么的。 cls_Driver 里有段代码如下 'lpInBuf 和 lpOutBuf 都是指向缓冲区的指针 Public Function IoControl(ByVal dwIoControlCode As Long, ByVal lpInBuffer As Long, ByVal nInBufferSize As Long, ByVal lpOutBuffer As Long, ByVal nOutBufferSize As Long, Optional ByRef lpBytesReturned As Long = 0) As Long Dim lDrvRetSize As Long IoControl = DeviceIoControl(hDrvHandle, dwIoControlCode, ByVal lpInBuffer, nInBufferSize, ByVal lpOutBuffer, nOutBufferSize, lDrvRetSize, ByVal 0) lpBytesReturned = lDrvRetSize End Function 以下是我对照它用vs2008 c++写的代码 int _tmain(int argc, _TCHAR* argv[]) { //获取路径 TCHAR tszPath[MAX_PATH]; GetModuleFileName(NULL,tszPath,MAX_PATH); *(_tcsrchr(tszPath,_T('\\')) + 1) = _T('\0'); _tcscat_s(tszPath,MAX_PATH,_T("mydriver.sys")); //载入驱动 if(LoadNTDriver(TEXT("DriverTest"),tszPath)) printf("Load Driver Sucess.\n"); else printf("Load Driver Faile\n"); //打开设备 HANDLE hDevice = CreateFile(TEXT("\\\\.\\NewPine"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hDevice == INVALID_HANDLE_VALUE) { printf("Can no open she bei:%d", GetLastError()); CloseHandle(hDevice); if(UnloadNTDriver(TEXT("DriverTest"))) printf("Unload Driver Sucess.\n"); return 0x01i32; } DWORD dwRet; DeviceIoControl(hDevice,2231680, "C:\Program Files\MSBuild\ndt.exe",4, 0, 0, &dwRet, 0); CloseHandle(hDevice); system("pause"); //卸载驱动 UnloadNTDriver(TEXT("Ring0")); return 0; } 运行时驱动加载成功,但运行到 红色部分就蓝屏,哪里出错呢? 该怎么改写呢? |
|
沙发#
发布于:2012-04-27 15:41
蓝掉是因为驱动有bug,比如判断有问题。当然,你发的数据可能也不对,但是通常不应该蓝掉。
这个需要具体调试了,最好联系驱动开发人员。 |
|
板凳#
发布于:2012-06-14 01:53
DeviceIoControl参数不对,去查一下
|
|