Креш ОС при обращении к шаровой памяти
От: Аноним  
Дата: 23.04.13 12:52
Оценка:
В приложении создаю шаровую память для передачи информации с приложения в драйвер:

#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 крешится. Что сделал не так?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.