Количество отображаемых видов в общей памяти в Windows

63
7

Есть ли способ проверить, сколько представлений было сопоставлено с файлом с отображением памяти в Windows?

Что-то вроде эквивалента shmctl(... ,IPC_STAT,...) в Linux?

спросил(а) 2021-01-25T16:01:01+03:00 5 месяцев назад
1
Решение
77

У меня была такая же потребность в доступе к количеству общих просмотров. Поэтому я задал этот вопрос: доступ к количеству отображаемых видов файлов с разделяемой памятью (Windows)

Вы можете найти решение, соответствующее вашим потребностям.

Согласно комментарию Scath, я собираюсь добавить здесь предлагаемое решение, хотя заслуга должна идти на eryksun и RbMm. Используя вызов NtQueryObject вы можете получить доступ к HandleCount (хотя он не может быть на 100% надежным):

#include <stdio.h>
#include <windows.h>
#include <winternl.h>

typedef NTSTATUS (__stdcall *NtQueryObjectFuncPointer) (
HANDLE Handle,
OBJECT_INFORMATION_CLASS ObjectInformationClass,
PVOID ObjectInformation,
ULONG ObjectInformationLength,
PULONG ReturnLength);

int main(void)
{
_PUBLIC_OBJECT_BASIC_INFORMATION pobi;
ULONG rLen;

// Create the memory mapped file (in system pagefile) (better in global namespace
// but needs SeCreateGlobalPrivilege privilege)
HANDLE hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE|SEC_COMMIT,
0, 1, "Local\\UniqueShareName");

// Get the NtQUeryObject function pointer and then the handle basic information
NtQueryObjectFuncPointer _NtQueryObject = (NtQueryObjectFuncPointer)GetProcAddress(
GetModuleHandle("ntdll.dll"), "NtQueryObject");

_NtQueryObject(hMap, ObjectBasicInformation, (PVOID)&pobi, (ULONG)sizeof(pobi), &rLen);

// Check limit
if (pobi.HandleCount > 4) {
printf("Limit exceeded: %ld > 4\n", pobi.HandleCount);
exit(1);
}
//...
Sleep(30000);
}

ответил(а) 2021-01-25T16:01:01+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема