当文件将被执行或由应用程序运行时,我需要识别并触发一个事件。 我知道我可以通过挂钩Windows程序来做到这一点,但我不知道Windows的程序或事件是什么情况。 例如,当一个autorun文件要执行,我的应用程序应该识别它,就像一个防病毒应用程序。
我不确定钩子是否对我的目的有用,如果解决scheme没有挂钩,请给我一个真正的解决scheme。
尝试使用PsSetCreateProcessNotifyRoutine
,这个函数添加了一个驱动程序提供的回调例程,或者从创建或者删除一个进程时调用的例程列表中删除它。
你可以找到一个很好的例子在这个链接写在C + +
检测Windows NT / 2K进程执行
UPDATE
另一个选择是使用WMI事件,检查Win32_Process类, ExecNotificationQuery方法和SWbemEventSource.NextEvent函数。
检查这个在delphi 7和Windows 7中测试过的示例,你必须从Delphi IDE之外运行这个应用程序,或者禁用EOleException异常的异常通知(检查这个链接 ),以避免被IDE拦截的EOleException
。
program GetWMI_InstanceCreationEvent; {$APPTYPE CONSOLE} uses SysUtils ,Windows ,ComObj ,ActiveX ,Variants; Function KeyPressed:boolean; //detect if an key is pressed var NumEvents : DWORD; ir : _INPUT_RECORD; bufcount : DWORD; StdIn : THandle; begin Result:=false; StdIn := GetStdHandle(STD_INPUT_HANDLE); NumEvents:=0; GetNumberOfConsoleInputEvents(StdIn,NumEvents); if NumEvents<> 0 then begin PeekConsoleInput(StdIn,ir,1,bufcount); if bufcount <> 0 then begin if ir.EventType = KEY_EVENT then begin if ir.Event.KeyEvent.bKeyDown then result:=true else FlushConsoleInputBuffer(StdIn); end else FlushConsoleInputBuffer(StdIn); end; end; end; function VarStrNUll(VarStr:OleVariant):string;//dummy function to handle null variants begin Result:=''; if not VarIsNull(VarStr) then Result:=VarToStr(VarStr); end; function GetWMIObject(const objectName: String): IDispatch; //create a wmi object instance var chEaten: Integer; BindCtx: IBindCtx; Moniker: IMoniker; begin OleCheck(CreateBindCtx(0, bindCtx)); OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker)); OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result)); end; Procedure GetWin32_InstanceCreationEvent; var objWMIService : OLEVariant; colMonitoredProcesses : OLEVariant; objLatestProcess : OLEVariant; begin objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2'); colMonitoredProcesses := objWMIService.ExecNotificationQuery('Select * From __InstanceCreationEvent Within 1 Where TargetInstance ISA ''Win32_Process'''); //Get the event listener while not KeyPressed do begin try objLatestProcess := colMonitoredProcesses.NextEvent(100);//set the max time to wait (ms) except on E:EOleException do if EOleException(E).ErrorCode=HRESULT($80043001) then //Check for the timeout error wbemErrTimedOut 0x80043001 objLatestProcess:=Null else raise; end; if not VarIsNull(objLatestProcess) then begin Writeln('Process Started '+VarStrNUll(objLatestProcess.TargetInstance.Name)); Writeln('CommandLine '+VarStrNUll(objLatestProcess.TargetInstance.CommandLine)); Writeln('PID '+VarStrNUll(objLatestProcess.TargetInstance.ProcessID)); end; end; end; begin try CoInitialize(nil); try Writeln('Press Any key to exit'); GetWin32_InstanceCreationEvent; finally CoUninitialize; end; except on E:Exception do Begin Writeln(E.Classname, ': ', E.Message); Readln; End; end; end.