Leider funktionierts nicht ganz so wie ich mir das vorgestellt hatte, ich bekomme immer 1 als Anzahl der Handles auf das Objekt, das Problem ist dass es sich bei normalen Datei-Objekten nicht um die Dateien selbst (FCBs) sondern um die Datei-Streams (CCBs) handelt. Man braeuchte daher erst einen
handle auf so ein file object selbst (FCB) - das geht wohl nur im kernel mode und ist vom file system driver abhaengig. Die Datei-Handles die man bei der Programmierung sieht sind lediglich Handles auf Datei-Streams (CCB) und somit variiert die Anzahl der Handles auf diese Objekte nur dann wenn man sie z.b. mit DuplicateHandle() dupliziert. CreateFile() erstellt dagegen nur neue Datei-Streams (CCB) die mit einem einzigen file object (FCB) verknuepft sind. Somit ergibt der nachfolgende Code leider grundsaetzlich nur HandleCount=1 weil man ja lediglich den Stream
Handle pruefen kann. An den FCB kommt man wohl nur mittels eines Treibers im Kernel Mode.
Ansonsten hier ist der Code mit dem man die Anzahl der geoeffneten Handles auf einen system-
handle (z.b. File Stream (CCB)) herausfinden kann:
Delphi-Quellcode:
const
ObjectBasicInformation = 0;
type
NTSTATUS = Integer;
TOBJECT_BASIC_INFORMATION =
record
Attributes: ULONG;
GrantedAccess: Cardinal;
HandleCount: ULONG;
PointerCount: ULONG;
PagedPoolUsage: ULONG;
NonPagedPoolUsage: ULONG;
Reserved:
array[0..2]
of ULONG;
NameInformationLength: ULONG;
TypeInformationLength: ULONG;
SecurityDescriptorLength: ULONG;
CreateTime: TLargeInteger;
end;
POBJECT_BASIC_INFORMATION = ^TOBJECT_BASIC_INFORMATION;
function NtQueryObject(
Handle: THandle;
ObjectInformationClass: Cardinal;
ObjectInformation: Pointer;
ObjectInformationLength: ULONG;
ReturnLenth: PULONG): NTSTATUS;
stdcall;
external '
ntdll.dll';
function GetObjectHandleCount(
Handle: THandle;
var HandleCount: Cardinal): Boolean;
var
obi: TOBJECT_BASIC_INFORMATION;
begin
Result := NtQueryObject(
Handle, ObjectBasicInformation, @obi, SizeOf(TOBJECT_BASIC_INFORMATION),
nil) >= 0;
if Result
then
begin
HandleCount := obi.HandleCount;
end;
end;
Ein Beispiel zur Benutzung der Funktion GetObjectHandleCount():
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
hFile: THandle;
HandleCount: Cardinal;
begin
hFile := CreateFile('c:\test.txt', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if hFile <> INVALID_HANDLE_VALUE then
begin
if GetObjectHandleCount(hFile, HandleCount) then
begin
ShowMessage(inttostr(HandleCount));
end;
CloseHandle(hFile);
end;
end;
Wie gesagt, bei Datei-Handles gibt die Funktion i.d.r. 1 zurueck (ausser man dupliziert das
Handle mittels DuplicateHandle()). Die Funktion ist auch auf andere
Handle-Typen anwendbar, z.b. Desktops (HDESK), Window Stations (HWINSTA), Jobs (HJOB), Mutexes, Semaphores, ... - nicht jedoch user handles wie HWNDs und
gdi handles!