В приложении создаю шаровую память для передачи информации с приложения в драйвер:
#define VIDEO_DRV_SIZE 2048 * 1536 * 3 + 3 * sizeof(int) // прошу не ругать , поставил этого крокодила временно
......
//create a memory share
m_hMemoryShareDrv = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
VIDEO_DRV_SIZE,
L"Global\\Restricted\\SplitCamDrvData");
if (!m_hMemoryShareDrv)
{
return;
}
m_pBufMemoryShareDrv = (uint8_t*)MapViewOfFile(m_hMemoryShareDrv,
FILE_MAP_ALL_ACCESS,
0,
0,
VIDEO_DRV_SIZE);
...............
далее записываю в эту память инфу
if (m_pBufMemoryShareDrv)
{
uint8_t* pBuf;
uint32_t bufSz = win32::Bmp24GetBufferSize(iWidth, iHeight);
memset(m_pBufMemoryShareDrv, 0, VIDEO_DRV_SIZE);
memcpy(m_pBufMemoryShareDrv, &bufSz, sizeof(uint32_t));
int i = sizeof(uint32_t);
memcpy(m_pBufMemoryShareDrv + i, &iWidth, sizeof(uint32_t));
i += sizeof(uint32_t);
memcpy(m_pBufMemoryShareDrv + i, &iHeight, sizeof(uint32_t));
i += sizeof(uint32_t);
}
Все ок!
Теперь в драйвере подключаюсь к этой памяти
RtlInitUnicodeString(&usSectionName, L"\\BaseNamedObjects\\Restricted\\SplitCamDrvData");
InitializeObjectAttributes(&objAttributes, &usSectionName, OBJ_CASE_INSENSITIVE, NULL, NULL);
status=ZwOpenSection(&m_SectionHandle, GENERIC_READ, &objAttributes);
if (NT_SUCCESS(status))
{
status = ZwMapViewOfSection(m_SectionHandle, ZwCurrentProcess(),
&m_pAddrMap, 0, viewSize, NULL, &viewSize, ViewShare, 0,
PAGE_READONLY);
if (NT_SUCCESS(status))
{
......................................
}
else
{
..............................................................
ZwClose(m_SectionHandle);
m_SectionHandle = NULL;
}
}
нет проблем, все мапируется.
Теперь в драйвере пробую почитать данный с приложения, используя m_pAddrMap
int sz = 0;
//memcpy(&sz, m_pAddrMap, 4);
int * pData=(int*)(m_pAddrMap);
sz=pData[0];
На последней строке Вин7 32 крешится. Что сделал не так?