liuwei_joshua
驱动牛犊
驱动牛犊
  • 注册日期2004-12-09
  • 最后登录2005-10-13
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1325回复:3

GreateFile运行后总是显示“参数设置不正确”

楼主#
更多 发布于:2005-04-18 14:51
  各位高手,我是新手,刚开始便驱动程序不久,但是遇到了一些问题,一直解决不了。
   我编写的是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分或更多分相赠,谢谢了
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-04-19 14:34
1、去掉FILE_ATTRIBUTE_NORMAL
2、确保你的IRP_MJ_CREATE处理正确
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
liuwei_joshua
驱动牛犊
驱动牛犊
  • 注册日期2004-12-09
  • 最后登录2005-10-13
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-04-19 22:55
我应该如何观察我的IRP_MJ_CREATE设置是否正确呢,我现在编的是NT的核心驱动程序,在驱动程序的设置过程中:我没有在程序中对IRP_MJ_CREATE进行设置。谢谢大哥了!
还有,怎么给分呢?
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-04-20 10:03
我应该如何观察我的IRP_MJ_CREATE设置是否正确呢,我现在编的是NT的核心驱动程序,在驱动程序的设置过程中:我没有在程序中对IRP_MJ_CREATE进行设置。谢谢大哥了!
还有,怎么给分呢?

看我的垃圾贴
http://www.driverdevelop.com/forum/html_89958.html?1113962549
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
游客

返回顶部