阿杰 发表于 2011-8-6 08:28:34

LoadDriver加载驱动代码


//OpenSCManager - > CreateService - > StartService 大概流程是这样...
function LoadDriver(lpService, lpFileName: string): Boolean;
const
METHOD_BUFFERED = $00000000;
FILE_SPECIAL_ACCESS = $00000000;
FILE_DEVICE_FILE_SYSTEM = $00000009;
FSCTL_SET_SPARSE = FILE_DEVICE_FILE_SYSTEM shl 16 or FILE_SPECIAL_ACCESS shl 14 or 49 shl 2 or METHOD_BUFFERED;
var
pStart: Pchar;
hFile: THandle;
hSC, hSvc: THandle;
BytesReturned: Cardinal;
hStatus: SERVICE_STATUS;
begin
Result := False;
if not FileExists(Pchar(lpFileName)) then Exit;
hSC := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
try
    if hSC <> 0 then
    begin
      hSvc := CreateService(hSC, PChar(lpService), PChar(lpService), SERVICE_START or SERVICE_STOP, SERVICE_KERNEL_DRIVER,
      SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, PChar(lpFileName), nil, nil, nil, nil, nil);
      if ERROR_SERVICE_EXISTS = GetLastError() then
      begin
      hSvc := OpenService(hSC, PChar(lpService), SERVICE_START);
      end;
      StartService(hSvc, 0, pStart);
      {ControlService(hSvc, SERVICE_CONTROL_STOP, hStatus);
   DeleteService(hSvc); }//这里是停止和删除服务的,哈哈
    end;
finally
    CloseServiceHandle(hSC);
end;
end;

DevilLiao 发表于 2013-1-11 19:29:59

感觉这种方式不稳定啊

kk1025 发表于 2013-4-15 15:12:05

DevilLiao 发表于 2013-1-11 19:29 static/image/common/back.gif
感觉这种方式不稳定啊

哪裡會不穩

upring 发表于 2015-3-19 11:26:18

基本调用原理清晰 谢谢斑竹
页: [1]
查看完整版本: LoadDriver加载驱动代码