Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   [Win7] Falsche Dateigröße von GetFileSize/Ex im system32 (https://www.delphipraxis.net/145265-%5Bwin7%5D-falsche-dateigroesse-von-getfilesize-ex-im-system32.html)

ErazerZ 28. Dez 2009 00:03


[Win7] Falsche Dateigröße von GetFileSize/Ex im system32
 
Hi,
ich hab da mal ein komisches Problem. Also auf meinem 64 Bit System rennt seit einer weile Windows 7. Nur heute ist mir etwas aufgefallen und zwar ist die Dateigröße von "C:\WINDOWS\SYSTEM32\notepad.exe" ist 193.536 Bytes = 189 KB. Jedoch ist DIESE Dateigröße nur über dem Windows-Eigenschaftenfenster zu sehen und über der Konsole (cmd.exe).
Zitat:

c:\Windows\System32>dir notepad.exe
Verzeichnis von c:\Windows\System32

14.07.2009 02:39 193.536 notepad.exe
1 Datei(en), 193.536 Bytes
0 Verzeichnis(se), 723.459.993.600 Bytes frei

c:\Windows\System32>

oder:
c:\Windows\SysWOW64>dir notepad.exe
Verzeichnis von c:\Windows\SysWOW64

14.07.2009 02:14 179.712 notepad.exe
1 Datei(en), 179.712 Bytes
0 Verzeichnis(se), 723.459.989.504 Bytes frei

c:\Windows\SysWOW64>
Wenn ich das ganze jetzt mittels GetFileSize/Ex überprüfe und zwar auf die Datei im C:\WINDOWS\SYSTEM32\ Verzeichnis dann bekomm ich trotzdem nur 179.712 Bytes!
Mein Code:

Code:
DWORD getFileSize(string FileName){
   LARGE_INTEGER lpSize = {};
   HANDLE hFile = CreateFileA((LPCSTR)FileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
   if (hFile != INVALID_HANDLE_VALUE){
      GetFileSizeEx(hFile, &lpSize);
      CloseHandle(hFile);
   }
   return lpSize.u.LowPart;
}
Jetzt meine Frage, weiß jemand von euch zufällig warum ich nie die 193.536 Bytes zurück bekomme sondern immer die 179.712 Bytes obwohl der Pfad der Datei auf C:\WINDOWS\SYSTEM32\notepad.exe zeigt?
Liegt es am 64 Bit? Irgendwelche fehlende Rechte die ich brauche? (Ich hab bereits die Debug-Privilegien)

Was mir noch gerade eben aufgefallen ist: Wenn ich cmd.exe in OllyDbg öffne (also dann wirds als 32 Bit geöffnet) und normal laufen lasse und dann "dir notepad.exe" eingebe dann zeigt er mir auch die größe von 179.712 Bytes an.

Hat jemand Ideen warum das so ist?

Mfg

wicht 28. Dez 2009 00:26

Re: [Win7] Falsche Dateigröße von GetFileSize/Ex im system32
 
Hi,

wenn dein Programm 32 Bit ist, dann wird aus Windows\SysWOW64 (glaube es heißt so, kanns nicht nachgucken gerade) gelesen, selbst wenn du aus system32 lesen willst. Damit das klappt, müsste dein Programm 64 Bit sein (Wie der Windows-Explorer, den du da benutzt). Es gibt allerdings eine API Funktion, mit der man für den eigenen Prozess bzw. einzelne Prozesse diese Umleitung abschalten kann. Weiß allerdings so nicht, wie die hieß... Das selbe gilt übrigens auch für einige Schlüssel in der Registrierung (und vielleicht auch anderen Sachen?).

HTH

ErazerZ 16. Feb 2010 18:51

Re: [Win7] Falsche Dateigröße von GetFileSize/Ex im system32
 
Ich bin heute mal über die API gestoßen die es einem ermöglicht das abzuschalten unter Win64 Bit.
Hier ist meine Funktion:


Code:
BOOL Enable64BitRedirection(BOOLEAN EnableRedirection)
{
   typedef BOOLEAN (WINAPI *LPF_Wow64EnableWow64FsRedirection)(BOOLEAN EnableRedirection);
   typedef BOOL (WINAPI *LPF_IsWow64Process) (__in HANDLE hProcess, __out PBOOL Wow64Process);

   BOOL Wow64Process;
   HMODULE hLib = LoadLibrary("kernel32.dll");

   LPF_IsWow64Process IsWow64Process = (LPF_IsWow64Process)GetProcAddress(hLib, "IsWow64Process");
   LPF_Wow64EnableWow64FsRedirection Wow64EnableWow64FsRedirection = (LPF_Wow64EnableWow64FsRedirection)GetProcAddress(hLib, "Wow64EnableWow64FsRedirection");

   if (IsWow64Process != NULL && Wow64EnableWow64FsRedirection != NULL)
   {
      if (IsWow64Process(GetCurrentProcess(), &Wow64Process) && Wow64Process)
      {
         // 64 bit process
         return Wow64EnableWow64FsRedirection(EnableRedirection);
      }
   }
   return FALSE;
}


DWORD getFileSize(LPCSTR FileName){
   LARGE_INTEGER lpSize = {};
   HANDLE hFile = CreateFileA(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
   if (hFile != INVALID_HANDLE_VALUE)
   {
      GetFileSizeEx(hFile, &lpSize);
      CloseHandle(hFile);
   }
   return lpSize.u.LowPart;
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
   DWORD filesize1, filesize2;
   char szOutput[200];
   filesize1 = getFileSize("c:\\windows\\system32\\notepad.exe");
   Enable64BitRedirection(FALSE);
   filesize2 = getFileSize("c:\\windows\\system32\\notepad.exe");
   wsprintfA(szOutput, "Size 1: %d bytes\nSize 2: %d bytes\n", filesize1, filesize2);
   MessageBox(0, szOutput, "Filesize", 0);
   return 0;
}


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

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