1. 程式人生 > >驅動程式與應用程式之間共享記憶體

驅動程式與應用程式之間共享記憶體

  隨手寫點自己碰到的問題。在寫核心模式的驅動程式時,經常需要做的就是驅動程式和應用程式之間的通訊。如應層程式和驅動程式之間共享事件來完成同步,事件可以有應用程式來建立然後將其控制代碼下發到驅動程式中,驅動程式進行引用等操作,就可以實現共享事件了。這裡就不說這個了,主要說說驅動和應用程式之間的共享。  

  共享的方式有很多,我們在應用層程式設計時,也經常需要程序之間共享記憶體。可以用過SendMessage,檔案對映等。也可以用dll來進行共享。用dll進行共享,大家應該知道#pragma data()這個巨集,在這個巨集中宣告的變數就可以共享了,是系統級全域性變數,但是必須程序之間引用的是同一個dll檔案。   在驅動進行記憶體的共享,也可以通過使用檔案對映的方式來實現。這個在後續中文章中描述。  

  我在這裡就說一種很簡單的方式來實現記憶體的共享。可以分成一個步驟來實現。    

  1. 我們在驅動中首先分配一段記憶體空間:      

複製程式碼
//當然這裡也可以用其他的函式,但是一定要是Nonpaged即非分頁記憶體。     
pShareMemory = ExAllocatePool(Nonpaged, BUFFER_SIZE);     

//具體引數忘記了,查ddk。分配一個MDL結構並初始化它。     
Mdl = IoAllocateMdl (pShareMemroy,....);                            

//重新對MDL結構進行賦值等。 
MmBuildMdlForNonpagedPool();
複製程式碼

  這樣我們就完成了對共享記憶體分配等操作。    

  2. 在驅動中我們對共享記憶體的寫操作。我們直接對gShareMemory記憶體進行操作就可以。可是使用memcpy等操作。就不詳細說明了。   

  3. 在應用程式中獲得共享記憶體地址。      

pchar  pbuffer = NULL;    //通過使用          
DeviceIoCtrl(hdev,IO_GET_SHAREMEM,NULL,0,&pbuffer,sizeof
(pvoid),&dwret,NULL); //如果返回成功,那麼pbuffer就得到了共享記憶體的地址,可以直接對其操作。

   4. 驅動是怎麼將共享記憶體地址給應用程式的。   

//將記憶體對映到使用者層程序空間中。   
UserVirtualAddress = MmMapLockedPagesSpecifyCache(Mdl,Usermode....);
//就這樣驅動程式和應用程式實現的記憶體的共享。在OSROnline上有個例項,有興趣可以看看。
*((PVOID *)Irp->AssociaedIrp.SystemBuffer = UserVirtualAddress;