【问题标题】:GetFileSizeEx fails for file mappingGetFileSizeEx 文件映射失败
【发布时间】:2011-09-29 20:08:12
【问题描述】:

我无法创建命名共享内存并检查其大小。当我在这样的函数中调用 GetFileSizeEx 函数时,它会失败。关于如何调试的任何想法?

void test_getsize(const char* lpName, int size){

    HANDLE handle = CreateFileMapping(
                     INVALID_HANDLE_VALUE,    // use paging file
                     NULL,                    // default security
                     PAGE_READWRITE,          // read/write access
                     0,                       // maximum object size (high-order DWORD)
                     size,                // maximum object size (low-order DWORD)
                     lpName);                 // name of mapping object

    if (handle== NULL || handle== INVALID_HANDLE_VALUE){
        last_error = get_error_from_errorno();
        *error_return =1;
    }


    LARGE_INTEGER new_size;

    err = GetFileSizeEx(handle, &new_size);

    if (err==0){ printf("err ");} else {printf("pass ");}
    printf("size=%lu\n", (unsigned long)new_size.QuadPart);
}

【问题讨论】:

  • 这段代码的结果是什么?
  • 您没有使用文件,无法获取不存在文件的大小。
  • 我有点(很多?)迟到了,但是你为什么不使用 MapViewOfFile/VirtualQuery 呢?

标签: c windows shared-memory


【解决方案1】:

您传递给GetFileSizeEx 的句柄必须是文件的句柄。您正在将一个句柄传递给一个文件映射,这是完全不同的事情,所以它不起作用。

由于显然您想要文件映射的大小(称为 section 对象),而且我认为 Win32 API 不提供此功能,因此您需要使用名为NtQuerySection。这是它可能如何工作的想法(我还没有尝试过):

typedef enum _SECTION_INFORMATION_CLASS
{
    SectionBasicInformation,
    SectionImageInformation
} SECTION_INFORMATION_CLASS;

typedef struct _SECTION_BASIC_INFORMATION {
  PVOID         Base;
  ULONG         Attributes;
  LARGE_INTEGER Size;
} SECTION_BASIC_INFORMATION;

typedef DWORD (WINAPI* NTQUERYSECTION)
    (HANDLE, SECTION_INFORMATION_CLASS, PVOID, ULONG, PULONG);
NTQUERYSECTION NtQuerySection =
    (NTQUERYSECTION)GetProcAddress(LoadLibrary("ntdll.dll"), "NtQuerySection");

SECTION_BASIC_INFORMATION SectionInfo = { 0 };
NTSTATUS = NtQuerySection(handle, SectionBasicInformation, &SectionInfo,
    sizeof(SectionInfo), 0);

【讨论】:

  • 感谢您的回复。从那以后,我发现返回的 HANDLE 是一个 Section 对象。如何查询节对象的大小?我读过“ZwQuerySection”,但它似乎只在 Windows NT 上。
  • @sean:您不会从用户模式调用Zw* 函数。使用我在更新答案中概述的 NtQuerySection 函数。
  • 由于 NtQuerySection 是一个未记录的 API,因此无法保证它会在未来版本的 Windows 中存在或以相同的方式工作。为什么不简单地记住用于创建节对象的大小?
  • 我不记得大小,因为内存映射句柄是在另一个进程中创建的。
  • 我在使用 NtQuerySection 时仍然遇到问题。它返回状态 0xC0000004 (STATUS_INFO_LENGTH_MISMATCH)。 The specified information record length does not match the length that is required for the specified information class. 但我没有看到任何标头显示 SECTION_BASIC_INFORMATION 结构有任何不同。有人有 NtQuerySection 的工作示例吗?
猜你喜欢
  • 2013-10-26
  • 2011-11-17
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 2021-12-23
  • 1970-01-01
相关资源
最近更新 更多