用DELPHI和C安装SYS驱动,同样的代码为什么DELPHI的有问题而C的没问题?
问题是这样的,用DELPHI安装SYS驱动,第一次成功,正常卸载驱动后,可以再安装SYS驱动。
安装完驱动后,如果未卸载驱动(如程序非正常关闭等),再安装时会提示安装出错(这时可以看到系统里已装有该驱动,所以出错),但是重新启动系统后仍然无法再安装驱动!!!这很奇怪!!不管怎么重启电脑都无效,重新安装系统后可以再安装,不过只要有一次安装完驱动后未卸载就只能再重新安装系统后才能再使用。这是怎么回事啊?
我试了用DELPHI里自带的CreateService和OpenService不行,用动态加载DLL的方式也不行。
同样的代码在C里面一点问题都没,可以正常使用,即使有问题重启系统就可以正常使用了。。真是太奇怪了!有什么办法能解决么?
DELPHI的代码:
function load_driver(): boolean;
var
temp: dword;
begin
{
temp := LoadLibrary('advapi32.dll');
if temp <> 0 then
begin
@CreateService1 := GetProcAddress(temp, 'CreateServiceA');
@OpenService1 := GetProcAddress(temp, 'OpenServiceA');
end;
}
IOCTL_GET_PHYS_ADDRESS := CTL_CODE(FILE_DEVICE_UNKNOWN,
$800, METHOD_BUFFERED,
FILE_READ_ACCESS + FILE_WRITE_ACCESS);
hSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if hSCManager <> 0 then
begin
GetFullPathName(PChar('VirtToPhys.sys'), SizeOf(acModulePath), acModulePath, lpTemp);
{ hService := CreateService1(hSCManager, 'VirtToPhys', 'VirtToPhys',
SERVICE_START + SERVICE_STOP + _DELETE, SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, acModulePath,
nil, nil, nil, nil, nil);
}
hService := CreateService(hSCManager, 'VirtToPhys', 'VirtToPhys',
SERVICE_START + SERVICE_STOP + _DELETE, SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, acModulePath,
nil, nil, nil, nil, nil);
if hService = 0 then
begin
{
OpenService1(hSCManager,'VirtToPhys',SERVICE_START + SERVICE_STOP + _DELETE);
}
OpenService(hSCManager,'VirtToPhys',SERVICE_START + SERVICE_STOP + _DELETE); //注:这句一点效果都没有。
end;
if hService <> 0 then
begin
{驱动程序的DriverEntry过程将被调用}
if StartService(hService, 0, lpTemp) = true then
begin
{驱动程序将接收IRP_MJ_CREATE I/O请求包(IRP)}
hDevice := CreateFile('\\.\slVirtToPhys', GENERIC_READ + GENERIC_WRITE,
0, nil, OPEN_EXISTING, 0, 0);
if hDevice = INVALID_HANDLE_VALUE then
begin
unload_driver();
ShowMessage('打开设备出错');
Exit;
end;
end
else begin
unload_driver();
ShowMessage('运行驱动出错');
Exit;
end;
end
else begin
unload_driver();
ShowMessage('创建驱动出错');
Exit;
end;
end;
end;
function unload_driver(): boolean;
begin
try
if hSCManager <> 0 then
begin
if hService <> 0 then
begin
if hDevice <> 0 then CloseHandle(hDevice);
ControlService(hService, SERVICE_CONTROL_STOP, _ss);
DeleteService(hService);
CloseServiceHandle(hService);
end;
CloseServiceHandle(hSCManager);
end;
except
end;
end;
C的代码:
#include <windows.h>
#include <stdio.h>
int main(int argc,char **argv)
{
printf("Load Driver\n载入驱动\n");
HANDLE scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
if(scm)
{
printf("Create Service\n创建服务\n");
printf("argv[1]=%s,argv[2]%s\n",argv[1],argv[2]);
HANDLE svc=CreateService(scm,argv[1],argv[2],SERVICE_START | DELETE | SERVICE_STOP,SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,argv[3],NULL,NULL,NULL,NULL,NULL);
if(!svc){
svc=OpenService(scm,argv[1],SERVICE_START | DELETE | SERVICE_STOP);
printf("Create Service\n创建服务1\n");
}
if(svc)
{
printf("Starting service\n运行驱动\n");
StartService(svc,0,NULL);
printf("Press Enter to stop and delete service \n按回车停止并卸载驱动!\n");
getchar();
DeleteService(svc);
CloseServiceHandle(svc);
} else printf("error: unable to create/open service\n错误:创建或打开服务(可能是驱动文件未找到)\n");
CloseServiceHandle(scm);
} else printf("error: unable to open manager\n");
return 0;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课