阅读:1326回复:3
GreateFile运行后总是显示“参数设置不正确”
各位高手,我是新手,刚开始便驱动程序不久,但是遇到了一些问题,一直解决不了。
我编写的是NT的核心驱动程序,但是在windowsXP操作系统下运行 CreateFile()时总是显示参数“设置不正确” 我对驱动程序进行操作的部分代码如下: //点击Start按钮后进入程序 BOOL StartControl() { ULONG nRet; ULONG error1,error; //threadFlag=1; k=0; // Open the device //获取设备路径 GetDriverPath(); //装载驱动程序 h=LoadDevice(szWinIoDriverPath,\"\\\\\\\\.\\\\IntrDemo0\",\"IntrDemo\");// if (h == INVALID_HANDLE_VALUE) { MessageBox(NULL,\"Can not open device\",\"Open Device \",NULL); exit(1); } // Create an event for notification hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (! DeviceIoControl( h, IOCTL_SET_NOTIFICATION_EVENT, &hEvent, sizeof(hEvent), NULL, 0, &nRet, NULL ) ) { MessageBox(NULL,\"IOCTLFAILED\",\"IOCTL_SET_NOTIFICATION_EVENT Error\",NULL); return false; } return true; } //设备路径获取子程序 bool GetDriverPath() { PSTR pszSlash; if (!GetModuleFileName(GetModuleHandle(NULL), szWinIoDriverPath, sizeof(szWinIoDriverPath))) return FALSE; pszSlash = strrchr(szWinIoDriverPath, \'\\\\\'); if (pszSlash) pszSlash[1] = 0; else return FALSE; strcat(szWinIoDriverPath, \"intrdemo.sys\"); return TRUE; } //用于装载驱动程序的子程序 HANDLE LoadDevice(LPCTSTR lpszDriverPath,LPCTSTR lpszDevicePath, LPCTSTR lpszServiceName) { HANDLE hDevice; SC_HANDLE hSCManager; // 服务控制管理器句柄 SC_HANDLE hService; // 服务句柄 BOOL bResult = FALSE; // 返回值,记录服务状态 LPVOID lpMsgBuf; //缓冲区 ULONG error,error1,error2; //正常启动的过程 UnLoadDevice(lpszServiceName); //停止先前加载的driver hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);// 打开服务控制管理器 if(hSCManager) { // 创建服务 hService = CreateService(hSCManager,lpszServiceName,lpszServiceName,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,lpszDriverPath,NULL,NULL,NULL,NULL,NULL); hService=OpenService(hSCManager, lpszServiceName, SERVICE_ALL_ACCESS); if(hService == NULL) { if(::GetLastError() == ERROR_SERVICE_EXISTS) { hService = ::OpenService(hSCManager, lpszServiceName, SERVICE_ALL_ACCESS);} } bResult=StartService(hService, 0, NULL); error=GetLastError(); CloseServiceHandle(hService);// 关闭服务句柄 CloseServiceHandle(hSCManager);// 关闭服务控制管理器句柄 } if(bResult) {hDevice=CreateFile( lpszDevicePath,GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); error=GetLastError(); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,error,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf,0,NULL); MessageBox(NULL,(LPCTSTR)lpMsgBuf,\"Error\",MB_OK|MB_ICONINFORMATION); LocalFree(lpMsgBuf);//情况相类似,没有特别的问题 }return hDevice; } BOOL UnLoadDevice(LPCTSTR lpszServiceName) { SC_HANDLE hSCManager; // 服务控制管理器句柄 SC_HANDLE hService; // 服务句柄 BOOL bResult; // 返回值 SERVICE_STATUS ServiceStatus; LPVOID lpMsgBuf; bResult = FALSE; ULONG error1,error2;// 打开服务控制管理器 hSCManager = OpenSCManager(NULL, NULL,SC_MANAGER_ALL_ACCESS); if(hSCManager) {// 打开服务 hService = OpenService(hSCManager, lpszServiceName, SERVICE_ALL_ACCESS); if(hService) { // 停止服务 bResult = ControlService(hService, SERVICE_CONTROL_STOP, &ServiceStatus); if(bResult==0){printf(\"Can\'t be stoped!\");} // 删除服务 bResult = bResult && DeleteService(hService); // 关闭服务句柄 CloseServiceHandle(hService); } // 关闭服务控制管理器句柄 CloseServiceHandle(hSCManager); } return bResult; } 在程序运行时,服务管理器等操作都没有问题,但是一执行到GreateFile时就显示参数设置不正确,我用ShowSymbolics观察了发现已经建立了对应的驱动程序的符号,而且在注册表中也已经建立了对应的驱动程序的键值,而且又通过DriverMonitor观察发现可以进入DriverEntry(),但是就是不能CreateFile。 哪位大虾能提小弟解决这个问题,小弟愿意30分或更多分相赠,谢谢了 |
|
沙发#
发布于:2005-04-19 14:34
1、去掉FILE_ATTRIBUTE_NORMAL
2、确保你的IRP_MJ_CREATE处理正确 |
|
|
板凳#
发布于:2005-04-19 22:55
我应该如何观察我的IRP_MJ_CREATE设置是否正确呢,我现在编的是NT的核心驱动程序,在驱动程序的设置过程中:我没有在程序中对IRP_MJ_CREATE进行设置。谢谢大哥了!
还有,怎么给分呢? |
|
地板#
发布于:2005-04-20 10:03
我应该如何观察我的IRP_MJ_CREATE设置是否正确呢,我现在编的是NT的核心驱动程序,在驱动程序的设置过程中:我没有在程序中对IRP_MJ_CREATE进行设置。谢谢大哥了! 看我的垃圾贴 http://www.driverdevelop.com/forum/html_89958.html?1113962549 |
|
|