2011-09-29 116 views
0

我無法創建命名的共享內存並檢查其大小。當我在像這樣的函數中調用GetFileSizeEx函數時失敗。有關如何調試的任何想法?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); 
} 
+0

這段代碼的結果是什麼? –

+0

您沒有使用文件,無法獲取不存在文件的大小。 –

+1

我遲了一點(很多?),但爲什麼不使用MapViewOfFile/VirtualQuery? – 2013-03-06 15:22:10

回答

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); 
+0

感謝您的回覆。後來我發現HANDLE返回的是一個Section對象。我如何查詢一個section對象的大小? 我讀過'ZwQuerySection',但它似乎只在Windows NT上。 – srossross

+1

@sean:你不會在用戶模式下調用'Zw *'函數。使用'NtQuerySection'函數,正如我在更新的答案中所概述的那樣。 – Gabe

+0

由於NtQuerySection是一個未公開的API,因此不能保證它會在未來版本的Windows中以相同的方式存在或工作。爲什麼不簡單記住用於創建截面對象的大小? –