0

私はこのアプローチを使用しようとしました:

#include <windows.h>
#include <iostream>

int main() {
  LARGE_INTEGER size;
  HANDLE hFile = CreateFile("c:\\pagefile.sys", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if (hFile == INVALID_HANDLE_VALUE) return(1);
  GetFileSizeEx(hFile, &size);
  CloseHandle(hFile);
  std::cout << size.QuadPart << std::endl;
}

しかし、ご覧のとおり、ロックされている「pagefile.sys」を指していると、プログラムは INVALID_HANDLE_VALUE に遭遇します。ただし、システム以外のアプリは、ロックされたファイルのサイズを確認できます。たとえば、総司令官は約1GBを提供し、どこかからこの値を取得する必要があります(そのファイルを単純に右クリックすることは言うまでもありませんが、それはシステムプロセスであるため、ファイルはそれにロックされていません)。それで、その場合のwinapi呼び出しはありますか?

提案された修正を含めるようにコードを更新しましたが、まだ機能しません。

#include <windows.h>
#include <iostream>

int main() {
  LARGE_INTEGER size;
  HANDLE hFile = CreateFile("c:\\pagefile.sys", 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  std::cout << "GetLastError: " << GetLastError() << std::endl;
  //says: 5 (0x5) ERROR_ACCESS_DENIED
  if (hFile == INVALID_HANDLE_VALUE) return(1);
  GetFileSizeEx(hFile, &size);
  CloseHandle(hFile);
  std::cout << size.QuadPart << std::endl;
}
4

2 に答える 2

6

ファイルのディレクトリエントリから情報を取得できますが、それをロックするメカニズムはありません。ディレクトリを反復するには、FindFirstFile/FindNextFile が必要です。返された WIN32_FIND_DATA.nFileSizeHigh/Low は、必要な情報を提供します。

取得した実際の数値は信頼できません。これは単なるスナップショットであり、古い可能性があります。特にページング ファイルの場合、Windows はそのサイズを急速に変更できます。信頼できるサイズを取得するには、ファイルをロックして、あなたのように誰も変更できないようにする必要があります。これはページング ファイルでは機能しません。オペレーティング システムはハード ロックを保持するため、誰もファイルの内容をいじったり、ファイルから機密データを読み取ったりすることはできません。

于 2013-02-02T16:34:16.217 に答える
0

MSDN によるとdwDesiredAccess、ファイルを開かずに情報のみが必要な場合は、パラメーターを 0 (ゼロ) に設定する必要があります。

于 2013-02-02T16:35:08.057 に答える