brisling
驱动牛犊
驱动牛犊
  • 注册日期2005-06-17
  • 最后登录2008-06-23
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:811回复:0

共享内存的问题,请大家帮帮忙!

楼主#
更多 发布于:2005-07-07 16:11
  我接触驱动编程不久,最近读了FileDisk的源代码,希望能稍加修改,实现我自己的一些功能。

    我的目的是想在驱动和自己写的用户程序之间创建一块共享内存。以后每次在驱动处理读写操作时,都将irp包中的读写参数(文件偏移量,读写的字节数等)写到共享内存中,然后通知用户程序来读取。

///////////////////////////////////////////////////////////////
// 首先,我在用户程序中创建了一个内存映射文件

g_hFileMap = CreateFileMapping(
              INVALID_HANDLE_VALUE,
              NULL,
              PAGE_READWRITE,
              0,
              64 * 1024,    // 64kB
              TEXT("MemShared"));

if (g_hFileMap == NULL)
{
       AfxMessageBox("Can't create file mapping.");
       return FALSE;
}



/////////////////////////////////////////////////////////////////////////////////////////
// 然后,在Filedisk的FileDiskThread()函数中

  在处理读操作的irp包时,即在源代码的:
   switch(io_stack->MajorFunction)
   {
    case IRP_MJ_READ:
  
   里添加了以下的代码:

OBJECT_ATTRIBUTES  objectAttributes;
UNICODE_STRING      ustrMemShared;
WCHAR                       MemSharedName[] = L"\\BaseNamedObjects\\MemShared";

//=============
//  打开共享内存
//=============
RtlInitUnicodeString(&ustrMemShared, MemSharedName);
InitializeObjectAttributes(
                    &objectAttributes,
                    &ustrMemShared,  
                    OBJ_CASE_INSENSITIVE,
                    NULL,
                    NULL);
status = ZwOpenSection(&hFileMap, SECTION_ALL_ACCESS, &objectAttributes);
if (status != STATUS_SUCCESS)
{
     irp->IoStatus.Status = status;
        irp->IoStatus.Information = 0;
        break;
}

//==============
// Map View
//==============
pData    = NULL;
viewSize = 0;
offset.QuadPart = 0;
status = ZwMapViewOfSection(
                    hFileMap,
                    (HANDLE) -1,
                    &pData,
                    0L,        
                    0,    
                    NULL,          // section offset
                    0,                // view size,
                    0,                // how the view is to be shared by a child process
                    0,
                    PAGE_READWRITE);
if (status != STATUS_SUCCESS)
{
        // ! 问题出在这里, 调用ZwMapViewOfSection()的结果,status = ‘参数错误’
     //   why ???  帮我找找原因 !!
        irp->IoStatus.Status = status;
        irp->IoStatus.Information = 0;
        ZwClose(hFileMap);
        break;
}

请大家帮我看看为什么调用ZwMapViewOfSection()会产生这样的结果。拜托,先谢谢了!
游客

返回顶部