2011-09-29 3 views
0

J'ai des problèmes pour créer une mémoire partagée nommée et inspecter sa taille. La fonction GetFileSizeEx échoue lorsque je l'appelle dans une fonction comme celle-ci. Des idées sur la façon de déboguer cela?GetFileSizeEx échoue pour le mappage de fichier

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

Et quel est le résultat de ce code? –

+0

Vous n'utilisez pas un fichier, vous ne pouvez pas obtenir la taille d'un fichier inexistant. –

+1

Je suis un peu (beaucoup?) En retard, mais pourquoi n'utilisez-vous pas MapViewOfFile/VirtualQuery? –

Répondre

4

Le handle que vous transmettez à GetFileSizeEx doit être un descripteur de fichier. Vous lui passez une poignée à un fichier cartographie, ce qui est une chose complètement différente, donc cela ne fonctionnera pas.

puisqu'apparemment vous voulez la taille du mappage de fichier (appelé un objet section ), et je ne pense pas que l'API Win32 fournit cette fonctionnalité, vous devez utiliser l'API native Windows appelé NtQuerySection. Voici une idée de comment cela pourrait fonctionner (je ne l'ai pas essayé):

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

Merci pour la réponse. J'ai depuis trouvé que le HANDLE retourné est un objet de section. Comment puis-je interroger la taille d'un objet section? J'ai lu à propos de "ZwQuerySection", mais il semble que ce soit sur Windows NT. – srossross

+1

@sean: Vous n'appelez pas les fonctions 'Zw *' du mode utilisateur. Utilisez la fonction 'NtQuerySection' comme je l'ai souligné dans ma réponse mise à jour. – Gabe

+0

Étant donné que NtQuerySection est une API non documentée, il n'y a aucune garantie qu'elle sera présente ou fonctionnera de la même manière dans une future version de Windows. Pourquoi ne pas simplement se souvenir de la taille utilisée pour créer l'objet section? –

Questions connexes