Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Dateiname aus Dateihandle ermitteln

  Alt 3. Sep 2008, 13:01
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"?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat