delphi加载驱动的代码演示

2018-10-31

*********************************************************************** }
{ 模块名称:MyDriver }
{ 模块功能:加载/卸载驱动程序 }
{ 版 本号:v1.0.0 }
{ 日 期:2008-5-18 }
{ *********************************************************************** }
unit MyDriver;

interface

uses
Windows,SysUtils,Tlhelp32,WinSvc;
{功能:加载驱动程序
参数:sztheDriverName:驱动程序完成路径.
szSvrName :驱动程序名称.}
function InstallDriver(sztheDriverName,szSvrName:string):Boolean;
{功能:卸载驱动程序
参数:szSvrName :驱动程序名称.}
function UnInstallDriver(szSvrName:string):Boolean;

implementation

function InstallDriver(sztheDriverName,szSvrName:string):Boolean;
var
hServiceMgr,hServiceTwdm:SC_HANDLE;
szDir:array[0..1023]of char;
lpsztheDriverName,p:PChar;
begin
ZeroMemory(@szDir,1024);
strcopy(szDir,Pchar(sztheDriverName));
lpsztheDriverName:=@szDir;
{打开服务控制管理器}
hServiceMgr := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS );

if hServiceMgr=0 then
begin
{OpenSCManager() Faild.}
Result:=False;
Exit;
end;

hServiceTwdm:=CreateService(hServiceMgr,
PChar(szSvrName), {SYSTEM\CurrentControlSet\Services驱动程序的在注册表中的名字}
PChar(szSvrName), {注册表驱动程序的 DisplayName 值}
SERVICE_ALL_ACCESS, {加载驱动程序的访问权限}
SERVICE_KERNEL_DRIVER,{表示加载的服务是驱动程序}
SERVICE_DEMAND_START, {注册表驱动程序的 Start 值}
SERVICE_ERROR_IGNORE, {注册表驱动程序的 ErrorControl 值}
lpsztheDriverName, {注册表驱动程序的 ImagePath 值}
nil,nil,nil,nil,nil);

if hServiceTwdm=0 then
begin
if GetLastError()=ERROR_SERVICE_EXISTS then
begin
{Service Exists}
hServiceTwdm:=OpenService(hServiceMgr,PChar(szSvrName),SERVICE_ALL_ACCESS);
if hServiceTwdm=0 then
begin
CloseServiceHandle(hServiceMgr);
Result:=False;
Exit;
end;
end
else
begin
CloseServiceHandle(hServiceMgr);
Result:=False;
Exit;
end;
end;

{Start the drivers}
if hServiceTwdm<>0 then
begin
if StartService(hServiceTwdm,0,p)=False then
begin
if ERROR_SERVICE_ALREADY_RUNNING=GetLastError() then
begin
{no real problem}
end
else
begin
CloseServiceHandle(hServiceMgr);
CloseServiceHandle(hServiceTwdm);
Result:=False;
Exit;
end;
end;

CloseServiceHandle(hServiceMgr);
CloseServiceHandle(hServiceTwdm);
end;

Result:=True;
end;

function UnInstallDriver(szSvrName:string):Boolean;
var
hServiceMgr,hServiceTwdm:SC_HANDLE;
SvrSta:SERVICE_STATUS;
begin
hServiceMgr:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS );
if hServiceMgr=0 then
begin
{OpenSCManager() Faild.}
Result:=False;
Exit;
end;

hServiceTwdm:=OpenService(hServiceMgr,PChar(szSvrName),SERVICE_ALL_ACCESS );
if hServiceTwdm=0 then
begin
{OpenService() Faild.}
CloseServiceHandle(hServiceMgr);
Result:=False;
Exit;
end;

{停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。}
if ControlService(hServiceTwdm,SERVICE_CONTROL_STOP,SvrSta)=False then
begin
{ControlService() Faild.}
CloseServiceHandle(hServiceTwdm);
CloseServiceHandle(hServiceMgr);
Result:=False;
Exit;
end;
{动态卸载驱动程序.}
if DeleteService(hServiceTwdm)=False then
begin
{DeleteSrevice() Faild.}
CloseServiceHandle(hServiceTwdm);
CloseServiceHandle(hServiceMgr);
Result:=False;
Exit;
end;

CloseServiceHandle(hServiceTwdm);
CloseServiceHandle(hServiceMgr);
Result:=True;
end;

end.
阅读16