![]() |
Memoryleak bei GetSecurityInfo
Hi Leute,
versuche für Prozess jeweils die SID heraus zu bekommen. Das ganze funktioniert auch, allerdings erhöht sich der Speicherbedarf meines Programms mit jedem Durchlauf (jedesmal 64 - 65 Prozesse) um ca. 4KB. :oops: Sicherheitsabfragen wurden zwecks Übersichtlichkeit entfernt:
Delphi-Quellcode:
Das Speicherloch entsteht definitiv in dieser Routine, da das Problem nicht auftritt, wenn sie nicht aufgerufen wird. Außerdem verdoppelt sich die Speicherverbrauchserhöhung, wenn ich die "selbe" Routine zusätzlich für die Gruppenzugehörigkeit aufrufe.
function TBdsProcess.GetProcessOwnerSID(ProcID: Cardinal): Pointer;
var hProc: THandle; pOwner: PSID; begin Result := nil; hProc := OpenProcess(PROCESS_QUERY_INFORMATION or GENERIC_READ, false, ProcID); try GetSecurityInfo(hProc, Cardinal(sotKernelObject), OWNER_SECURITY_INFORMATION, @pOwner, nil, nil, nil, nil); if IsValidSID(pOwner) then Result := pOwner; finally CloseHandle(hProc); end; end; Irgendeine Idee??? Gruß BlackDragon |
Re: Memoryleak bei GetSecurityInfo
************************* UPDATE *****************************************
Hi nochmal, Bin jetzt ein wenig verwirrt. :oops: Wenn ich der Funktion GetSecurityInfo zusätzlich den Pointer auf den SecurityDescriptor mitgebe, und diesen später über LocalFree wieder freigebe, ist das Speicherleck beseitigt.
Delphi-Quellcode:
Allerdings bekomme ich jetzt eine andere SID.
function TBdsProcess.GetProcessOwnerSID(ProcID: Cardinal): Pointer;
var hProc: THandle; pOwner: PSID; pSD: PSECURITY_DESCRIPTOR; begin Result := nil; try hProc := OpenProcess(PROCESS_QUERY_INFORMATION or GENERIC_READ, false, ProcID); try GetSecurityInfo(hProc, Cardinal(sotKernelObject), OWNER_SECURITY_INFORMATION, @pOwner, nil, nil, nil, @pSD); if IsValidSID(pOwner) then Result := pOwner; // "sagt" ist gültig finally LocalFree(Cardinal(pSD)); end; finally CloseHandle(hProc); end; end; IsValidSID sagt das die SID gültig ist. ConvertSidToStringSid gibt mir allerdings einen leeren String zurück und über GetLastError bekomme ich den Fehlercode: 1337 ( = ERROR_INVALID_SID) zurück.
Delphi-Quellcode:
...
var pcSIDString: PChar; begin ... ConvertSidToStringSid(SID, @pcSIDString); // -> GetLastError gibt hier 1337 ... end; Fakt ist also, dass GetSecurityInfo in jedem Fall Speicher für den SecurityDescriptor reserviert. Freigeben kann ich den Speicher logischerweise nur, wenn ich den Pointer habe. Vielleicht kann ja jemand helfen. :oops: Falls noch irgendwelche Infos fehlen, bitte sagen. Gruß BlackDragon |
Re: Memoryleak bei GetSecurityInfo
Der Security Descriptor ist ein Record, der auch deinen Owner enthält.
Delphi-Quellcode:
Die Funktion gibt einen Zeiger auf den Descriptor, sowie auf den Owner zurück. Und du kopierst den Zeigerwert (nicht Inhalt) nach Result.
PSecurityDescriptor = ^tSecurityDescriptor;
TSecurityDescriptor = record Owner : TSid; end; pOwner := @SD^.Owner; Wenn du jetzt den SD löscht, dann wird der Rückgabewert ungültig. |
Re: Memoryleak bei GetSecurityInfo [Gelöst]
Hi nochmal,
genau da lag wohl das Problem. Erledige jetzt alle relevanten Dinge direkt nach dem Aufruf und dann gebe ich den SecurityDescriptor frei. Keine Probleme mehr und alles läuft. Vielen Dank Dezipaitor. :dp: Gruss BlackDragon |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz