GetFileSizeEx无法进行文件映射

时间:2011-09-29 20:08:12

标签: c windows shared-memory

我无法创建命名共享内存并检查其大小。当我在这样的函数中调用它时,函数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);
}

1 个答案:

答案 0 :(得分:4)

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

由于显然您需要文件映射的大小(称为节对象),并且我认为Win32 API不提供此功能,您需要使用调用的本机Windows 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);