sro*_*oss 1 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);
}
Run Code Online (Sandbox Code Playgroud)
您传递给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);
Run Code Online (Sandbox Code Playgroud)