Ich habe hier folgende Funktion, um zu einem Dateihandle den dateinamen zu ermitteln:
Delphi-Quellcode:
type
PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;
IO_STATUS_BLOCK = packed record
Status: NTSTATUS;
Information: DWORD;
end;
TIOStatusBlock = IO_STATUS_BLOCK;
PFILE_NAME_INFORMATION = ^FILE_NAME_INFORMATION;
FILE_NAME_INFORMATION = packed record
FileNameLength: ULONG;
FileName: array[0..MAX_PATH - 1] of WideChar;
end;
TFileNameInformation = FILE_NAME_INFORMATION;
PUNICODE_STRING = ^TUNICODE_STRING;
TUNICODE_STRING = packed record
Length: WORD;
MaximumLength: WORD;
Buffer: array[0..MAX_PATH - 1] of WideChar;
end;
POBJECT_NAME_INFORMATION = ^OBJECT_NAME_INFORMATION;
OBJECT_NAME_INFORMATION = packed record
Name: TUNICODE_STRING;
end;
TObjectNameInformation = OBJECT_NAME_INFORMATION;
var
NtQueryInformationFile: function(FileHandle: THandle;
IoStatusBlock: PIO_STATUS_BLOCK;
FileInformation: Pointer;
Length: DWORD; FileInformationClass: DWORD): NTStatus; stdcall = nil;
NtQueryObject : function(ObjectHandle: THandle;
ObjectInformationClass: DWORD; ObjectInformation: Pointer;
ObjectInformationLength: ULONG;
ReturnLength: PDWORD): NTStatus; stdcall = nil;
function GetFileNameByHandle(FileHandle: THandle): string;
var
FileNameInfo : TFileNameInformation;
ObjectNameInfo : TObjectNameInformation;
IoStatusBlock : TIOStatusBlock;
res, dwReturn : DWORD;
begin
result := '';
Writeln(FileHandle);
res := NtQueryInformationFile(FileHandle, @IoStatusBlock, @FileNameInfo,
SizeOf(FileNameInfo.FileName), FileNameInformation);
if res = STATUS_SUCCESS then
begin
res := NtQueryObject(FileHandle, ObjectNameInformation,
@ObjectNameInfo, SizeOf(ObjectNameInfo.Name.Buffer), @dwReturn);
if res = STATUS_SUCCESS then
begin
SetLength(result, MAX_PATH);
SetLength(result, WideCharToMultiByte(CP_ACP, 0,
@ObjectNameInfo.Name.Buffer[ObjectNameInfo.Name.MaximumLength -
ObjectNameInfo.Name.Length],
ObjectNameInfo.Name.Length div SizeOf(WideChar),
@result[1], MAX_PATH, nil, nil));
end
else
begin
SetLength(result, MAX_PATH);
SetLength(result, WideCharToMultiByte(CP_ACP, 0,
@FileNameInfo.FileName[0], FileNameInfo.FileNameLength div
SizeOf(WideChar), @result[1], MAX_PATH, nil, nil));
end;
end;
end;
Ich habe eine Liste von Dateihandle, die ich durchgehe und die obige Funktion für jedes
Handle aufrufe. Jetzt ist es allerdings so, dass der Code stecken bleibt, wenn ich obigen Code verwende. Das heißt, er arbeitet die Liste nicht mehr ab und hört mitten drin auf. Kommentiere ich den Aufruf der Funktion aus, geht er die ganze Liste bis zum Ende durch.
Was ist an der Funktion falsch, dass er dort "hängenbleibt"?