Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi ProcessList stürzt ab nach kurzer zeit 64Bit (https://www.delphipraxis.net/197635-processlist-stuerzt-ab-nach-kurzer-zeit-64bit.html)

EWeiss 23. Aug 2018 17:10

ProcessList stürzt ab nach kurzer zeit 64Bit
 
Delphi-Quellcode:
procedure TProcess.GetUserInformation;
type
  PTokenUser = ^TTokenUser;

  TTokenUser = record
    User: TSIDAndAttributes;
  end;
const
  PROCESS_QUERY_LIMITED_INFORMATION = $1000;

var
  vHandle: THandle;
  vToken: THandle;
  vUserName: array [0 .. 255] of char;
  vDomainName: array [0 .. 255] of char;
  vUserNameSize: DWORD;
  vDomainNameSize: DWORD;
  vTokenUser: PTokenUser;
  vInfoSize: Cardinal;
  vUse: SID_NAME_USE;
begin
  FUser := '';
  FDomain := '';

  vHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, FID);
  if vHandle > 0 then
    try
      if OpenProcessToken(vHandle, TOKEN_QUERY, vToken) then
        try
          GetTokenInformation(vToken, TokenUser, nil, 0, vInfoSize);
          vUserNameSize := SizeOf(vUserName);
          vDomainNameSize := SizeOf(vDomainName);
          vUse := SidTypeUser;
          GetMem(vTokenUser, vInfoSize);
          try
            if not GetTokenInformation(vToken, TokenUser, vTokenUser, vInfoSize, vInfoSize) then
              raise ESystemError.Create;
            LookupAccountSid(nil, vTokenUser.User.Sid, @vUserName, vUserNameSize, @vDomainName,
              vDomainNameSize, vUse);
            FUser := vUserName;
            FDomain := vDomainName; // << Hier stürzt die Anwendung ab nur unter 64Bit.
          finally
            FreeMem(vTokenUser);
          end;
        finally
          CloseHandle(vToken);
        end;
    finally
      CloseHandle(vHandle);
    end;
end;
Weis jemand warum ?

gruss

KodeZwerg 23. Aug 2018 17:16

AW: ProcessList stürzt ab nach kurzer zeit 64Bit
 
Sollte es nicht WideString sein als deine vUserName & vDomainName ?

Delphi-Quellcode:
function GetNameFromSid(ASID: String): String;
var
  lSidLen: DWORD;
  lSid: PSID;
  lName, lDomain: WideString;
begin
  lSidLen := SECURITY_MAX_SID_SIZE;

  lSid := AllocMem(lSidLen);
  try
    StringToSID(ASID, lSid, lSidLen);
    LookupAccountBySid(lSid, lName, lDomain);
    Result := lName;
  finally
    FreeMem(lSid);
  end;
end;

Dalai 23. Aug 2018 17:21

AW: ProcessList stürzt ab nach kurzer zeit 64Bit
 
Prüf den Rückgabewert von LookupAccountSid und rufe GetLastError im Falle des Fehlschlagens. Vielleicht bringt dich das weiter.

@KodeZwerg:
Er nutzt doch ein
Delphi-Quellcode:
array of char
, was auf einem Unicode-fähigen Delphi zu
Delphi-Quellcode:
array of WideChar
wird. Statisches Array, daher auch ohne Speicherreservierung. Wichtig wäre aber noch, das Array zu nullen, bevor man damit arbeitet.

Grüße
Dalai

EWeiss 23. Aug 2018 17:30

AW: ProcessList stürzt ab nach kurzer zeit 64Bit
 
Zitat:

Zitat von KodeZwerg (Beitrag 1411437)
Sollte es nicht WideString sein als deine vUserName & vDomainName ?

Delphi-Quellcode:
function GetNameFromSid(ASID: String): String;
var
  lSidLen: DWORD;
  lSid: PSID;
  lName, lDomain: WideString;
begin
  lSidLen := SECURITY_MAX_SID_SIZE;

  lSid := AllocMem(lSidLen);
  try
    StringToSID(ASID, lSid, lSidLen);
    LookupAccountBySid(lSid, lName, lDomain);
    Result := lName;
  finally
    FreeMem(lSid);
  end;
end;

Wenn es Monate lang ohne Problem funktioniert hat warum dann jetzt WideString anstelle von Array of char verwenden. ?
Das Problem tritt nur mit 64Bit auf.
Hmmm...

Zitat:

Prüf den Rückgabewert von LookupAccountSid und rufe GetLastError im Falle des Fehlschlagens. Vielleicht bringt dich das weiter.
Danke wird wohl das beste sein.

gruss

KodeZwerg 23. Aug 2018 17:43

AW: ProcessList stürzt ab nach kurzer zeit 64Bit
 
Zitat:

Zitat von EWeiss (Beitrag 1411434)
Delphi-Quellcode:
procedure TProcess.GetUserInformation;
type
  PTokenUser = ^TTokenUser;

  TTokenUser = record
    User: TSIDAndAttributes;
  end;
const
  PROCESS_QUERY_LIMITED_INFORMATION = $1000;

var
  vHandle: THandle;
  vToken: THandle;
//  vUserName: array [0 .. 255] of char;
//  vDomainName: array [0 .. 255] of char;
  vUserName, vDomainName: string;
  vUserNameSize: DWORD;
  vDomainNameSize: DWORD;
  vTokenUser: PTokenUser;
  vInfoSize: Cardinal;
  vUse: SID_NAME_USE;
begin
  FUser := '';
  FDomain := '';

  vHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, FID);
  if vHandle > 0 then
    try
      if OpenProcessToken(vHandle, TOKEN_QUERY, vToken) then
        try
          GetTokenInformation(vToken, TokenUser, nil, 0, vInfoSize);
          vUserNameSize := SizeOf(vUserName);
          vDomainNameSize := SizeOf(vDomainName);
          vUse := SidTypeUser;
          GetMem(vTokenUser, vInfoSize);
          try
            if not GetTokenInformation(vToken, TokenUser, vTokenUser, vInfoSize, vInfoSize) then
              raise ESystemError.Create;


            vUserNameSize := 0;
            vDomainNameSize := 0;
            LookupAccountSid(nil, vTokenUser.User.Sid, nil, vUserNameSize, nil,
              vDomainNameSize, vUse);
            SetLength(vUserName, NamevUserNameSize);
            SetLength(vDomainName, vDomainNameSize);
            LookupAccountSid(nil, vTokenUser.User.Sid, PChar(vUserName), vUserNameSize, PChar(vDomainName),
              vDomainNameSize, vUse);
//            Result := PChar(vDomainName) + '/' + PChar(vUserName);
            FUser := PChar(vUserName);
            FDomain := PChar(vDomainName); // << Hier stürzt die Anwendung ab nur unter 64Bit.


          finally
            FreeMem(vTokenUser);
          end;
        finally
          CloseHandle(vToken);
        end;
    finally
      CloseHandle(vHandle);
    end;
end;
Weis jemand warum ?

gruss

Ich habe mal den LookupAccountSid Teil angepasst, weiter oben stimmt nun etwas nicht wegen veränderung.... grrrr

EWeiss 23. Aug 2018 17:49

AW: ProcessList stürzt ab nach kurzer zeit 64Bit
 
OK Danke aber ich habe es schon selbst auf meiner art gemacht ;)
Einfach ein try.. except und ein anschließendes
Delphi-Quellcode:
      raise Exception.Create(SysErrorMessage(GetLastError));


gruss

KodeZwerg 23. Aug 2018 18:02

AW: ProcessList stürzt ab nach kurzer zeit 64Bit
 
Zitat:

Zitat von Dalai (Beitrag 1411439)
@KodeZwerg:
Er nutzt doch ein
Delphi-Quellcode:
array of char
, was auf einem Unicode-fähigen Delphi zu
Delphi-Quellcode:
array of WideChar
wird. Statisches Array, daher auch ohne Speicherreservierung. Wichtig wäre aber noch, das Array zu nullen, bevor man damit arbeitet.

Grüße
Dalai

Ja da verliere ich oft den Überblick, Danke nochmal für Info :thumb:

Schokohase 23. Aug 2018 19:28

AW: ProcessList stürzt ab nach kurzer zeit 64Bit
 
Kleiner Hinweis:

Schaut mal was Delphi-Referenz durchsuchenSystem.SysUtils.RaiseLastOsError macht.

EWeiss 23. Aug 2018 19:35

AW: ProcessList stürzt ab nach kurzer zeit 64Bit
 
Zitat:

Zitat von Schokohase (Beitrag 1411458)
Kleiner Hinweis:

Schaut mal was Delphi-Referenz durchsuchenSystem.SysUtils.RaiseLastOsError macht.

yep.. habe es geändert ;)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf