驅動程式與應用程式之間共享記憶體
阿新 • • 發佈:2019-01-01
隨手寫點自己碰到的問題。在寫核心模式的驅動程式時,經常需要做的就是驅動程式和應用程式之間的通訊。如應層程式和驅動程式之間共享事件來完成同步,事件可以有應用程式來建立然後將其控制代碼下發到驅動程式中,驅動程式進行引用等操作,就可以實現共享事件了。這裡就不說這個了,主要說說驅動和應用程式之間的共享。
共享的方式有很多,我們在應用層程式設計時,也經常需要程序之間共享記憶體。可以用過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;