加载驱动时出现的问题

维祺 2013-09-08 05:37:19
我最近在学一些关于驱动方面的知识,但有一个问题老是解决不了代码如下
这是一段加载驱动的代码,我在我的64位CPU,64位win7系统下老下运行出错,但在32位系统上或32位cpu配64位win7却能正常运行,上面出错原因是
StartService faild() 2!这好像是路径问题,但是我的路径可以很确定没有问题的,有没有高人帮我看下哪里出问题了
#include<windows.h>
#include<winsvc.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>

LPCWSTR DRIVER_NAME={"GENERICDRV"};
LPCWSTR DRIVER_PATH={"amifldrv64.sys"};


//加载驱动的程序,但是这个程序在win7下可能需要管理员权限才能
//打开SCManager或加载驱动
BOOL LoadNTDriver(LPCWSTR lpszDriverName,LPCWSTR lpszDriverPath)
{
DWORD dwRtn;
LPWSTR szDriverImagePath[MAX_PATH];
BOOL bRet = FALSE;

SC_HANDLE hServiceMgr = NULL;
SC_HANDLE hServiceDDK = NULL;
GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL);

hServiceMgr = OpenSCManager(
NULL, // SCM database
NULL,
SC_MANAGER_ALL_ACCESS// name of service
);

if( hServiceMgr == NULL )
{
//OpenSCManager
printf( "OpenSCManager() Faild %d ! \n", GetLastError() );
getchar();
bRet = FALSE;
goto BeforeLeave;
}
else
{
////OpenSCManager
printf( "OpenSCManager() ok ! \n" );
}


hServiceDDK = CreateService( hServiceMgr,
lpszDriverName,
lpszDriverName,
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
szDriverImagePath,
NULL,
NULL,
NULL,
NULL,
NULL);




if( hServiceDDK == NULL )
{
dwRtn = GetLastError();
if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )
{

printf( "CrateService() Faild %d ! \n", dwRtn );
getchar();
bRet = FALSE;
goto BeforeLeave;
}
else
{

printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" );
}


hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );
if( hServiceDDK == NULL )
{

dwRtn = GetLastError();
printf( "OpenService() Faild %d ! \n", dwRtn );
getchar();
bRet = FALSE;
goto BeforeLeave;
}
else
{
printf( "OpenService() ok ! \n" );
}
}
else
{
printf( "CrateService() ok ! \n" );
}


bRet= StartService(hServiceDDK, NULL, NULL);
if(!bRet)
{
DWORD dwRtn = GetLastError();
if(dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING)
{
printf( "StartService() Faild %d ! \n", dwRtn );

bRet = FALSE;
goto BeforeLeave;
}
else
{
if(dwRtn == ERROR_IO_PENDING)
{

printf("StartService() Faild ERROR_IO_PENDING ! \n");
getchar();
bRet = FALSE;
goto BeforeLeave;
}
else
{

printf("StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n");
bRet = TRUE;
goto BeforeLeave;
}
}
}
bRet = TRUE;
//DeleteFile(szDriverImagePath);

BeforeLeave:
if(hServiceDDK)
{
CloseServiceHandle(hServiceDDK);
}
if(hServiceMgr)
{
CloseServiceHandle(hServiceMgr);
}
return bRet;
}
谢谢了。
...全文
233 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
维祺 2013-09-10
  • 打赏
  • 举报
回复
问题已经找到了,程序是没有问题的,只是我的VS可能环境配制有问题,我用了绿色版的VC6.0编译了下程序,发现在我的电脑上可以运行了。但是很感谢大家的支持啊,第一次有CSDN上发帖子就有人帮忙,谢谢大家了。如果有人能告诉我要怎么配置VS环境我会感激不尽的。
熊熊大叔 2013-09-09
  • 打赏
  • 举报
回复
参考http://stackoverflow.com/questions/13545675/startservice-and-sc-start-return-error-file-not-found When it's running in WOW64 it goes to Windows\SysWOW64 not system32. Once I copied the 32 bit Service .exe into Windows\SysWOW64 and ran it the Service started!
独孤的根号3 2013-09-09
  • 打赏
  • 举报
回复
这个帖子应该去嵌入式那个区去发,靠谱点,会一点驱动但真心不太懂,坐等2楼解惑
维祺 2013-09-09
  • 打赏
  • 举报
回复
引用 2 楼 truelance 的回复:
参考http://stackoverflow.com/questions/13545675/startservice-and-sc-start-return-error-file-not-found When it's running in WOW64 it goes to Windows\SysWOW64 not system32. Once I copied the 32 bit Service .exe into Windows\SysWOW64 and ran it the Service started!
能不能说下具体要怎么弄啊,谢谢啊
维祺 2013-09-09
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
总不至于不是以管理员身份登录吧。
其实我一直以管理员身份在运行程序····。难道真的没救了···
赵4老师 2013-09-09
  • 打赏
  • 举报
回复
总不至于不是以管理员身份登录吧。
赵4老师 2013-09-09
  • 打赏
  • 举报
回复
要不不用自己写驱动,直接在应用层调用WinIO.sys? 其实我具体也没弄过,个人意见仅供参考。
维祺 2013-09-09
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
听说64位驱动需要微软签名才能加载。
没错,是要签名的,但是我的这个驱动就是用的官方版本的驱动来着,我在做的其实是一个刷写bios的工具的反汇编,但是现在就卡在这个加载驱动上了。那个官方版本的程序我运行过没问题,而且我做过32位的也是这个工具的逆向,在加载时没有出现这个问题。求赵老师帮忙
赵4老师 2013-09-09
  • 打赏
  • 举报
回复
听说64位驱动需要微软签名才能加载。
维祺 2013-09-09
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
在64位Windows下: 64位drivers.sys在目录c:\windows\system32\drivers目录下; 32位drivers.sys在目录c:\windows\syswow64\drivers目录下;
你的意思是将我的那个amifldrv64.sys文件放入到c:\windows\system32\drivers目录下吗,我试了下还是不行啊。求教
赵4老师 2013-09-09
  • 打赏
  • 举报
回复
在64位Windows下: 64位drivers.sys在目录c:\windows\system32\drivers目录下; 32位drivers.sys在目录c:\windows\syswow64\drivers目录下;
维祺 2013-09-09
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下;
那我应该怎么办呢,求详细点的教程,谢谢
赵4老师 2013-09-09
  • 打赏
  • 举报
回复
在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下;
whizer 2013-09-09
  • 打赏
  • 举报
回复

bRet= StartService(hServiceDDK, NULL, NULL);
if(!bRet)
{
DWORD dwRtn = GetLastError();
if(dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING)
{
printf( "StartService() Faild %d ! \n", dwRtn );  //查查这个返回值对应的说明.

bRet = FALSE;
goto BeforeLeave;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧