всем доброго дня!
Delphi 7, Windows 7 x64. через ZwQueryObject, DuplicateHandle и ZwQuerySystemInformation получаю информацию о каждом процессе - какой у него хендл к какому объекту. да только вот не про все файлы мне инфа выдается - получаю PID, получаю хендл, а имя файла отчего то не получаю. заметил, к примеру, что тот же пресловутый куст реестра - будь то SAM, SOFTWARE, SYSTEM - не важно, я могу в эксплорере открыть свойства и глянуть на размер файла и прочую ерунду, а вот через свою программу я не вижу чтобы система имела хендл этих файлов. вероятно, среди тех строк, где кроме PID и Handle нет имени, они и присутствуют, но до конца не уверен.
в конечном итоге мне необходимо будет просто по хендлу открывать файлы и обсчитывать их котрольную сумму - с этим проблем нет, под WinXP получается чуток проще узнать хендл и открыть файл, а вот под семеркой - ну никак.
подскажите, плиз, как же заполучить хендлы не только этих файлов, но и вообще - отчего я не вижу полной картины.
кусочек из лога:
| Код | PID Handle Path 3396 2684 \Device\HarddiskVolume3\Windows\System32\ru-RU\msctfui.dll.mui 3396 2728 3396 2736 \Device\HarddiskVolume3\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static\CLI.Caste.HydraVision.Dashboard.dll 3396 2744 3396 2756 \Device\HarddiskVolume3\Windows\assembly\GAC_MSIL\System.Core\3.5.0.0__b77a5c561934e089\System.Core.dll 3396 2860 3396 2952 3396 2960
|
код перечисления хендлов, PIDов и линков:
| Код | function GetInfoTable(ATableType: dword): Pointer; var mSize: dword; mPtr: pointer; St: cardinal; begin Result := nil; mSize := $4000; repeat mPtr := VirtualAlloc(nil, mSize, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE); if mPtr = nil then Exit; St := ZwQuerySystemInformation(ATableType, mPtr, mSize, nil); if St = cardinal($C0000004) then begin VirtualFree(mPtr, 0, MEM_RELEASE); mSize := mSize * 2; end; until St <> cardinal($C0000004); if St = 0 then Result := mPtr else VirtualFree(mPtr, 0, MEM_RELEASE); end;
procedure GetHandles; var inf: PSYSTEM_HANDLE_INFORMATION_EX; i: integer; process, h: cardinal; p: pointer; buf: array[0..max_path] of char; s, tm: string; _out : TStringList; begin _out := TStringList.Create; p := GetMemory(max_path); ZeroMemory(p, max_path); inf := GetInfoTable(SystemHandleInformation); for i := 0 to inf.NumberOfHandles - 1 do begin if inf.Information[i].ObjectTypeNumber = OB_TYPE_FILE then begin process := OpenProcess(PROCESS_DUP_HANDLE, false, inf.Information[i].ProcessId); tm := ''; tm := IntToStr(inf.Information[i].ProcessId) + ' '; DuplicateHandle(process, inf.Information[i].Handle, GetCurrentProcess, @h, 0, false, DUPLICATE_SAME_ACCESS); tm := tm + IntToStr(inf.Information[i].Handle) + ' '; ZwQueryObject(h, 1, p, max_path, nil); tm := tm + WideCharToString(TUnicodeString(p^).Buffer); _out.Add(tm); _out.SaveToFile('C:\2.txt'); ZeroMemory(p, max_path); CloseHandle(h); CloseHandle(process); end; end; _out.Free; end;
|
|