鍵盤驅動程式是乙個最基本的驅動程式,通過學習這個簡單而實用的驅動程式來了解reactos驅動程式的結構,驅動程式的執行流程。在前面的i/o管理器分析裡,已經知道作業系統載入驅動程式的過程,也了解了驅動程式在系統裡是以驅動程式物件來管理的,也就是通過driver_object物件來表示乙個驅動程式的。
鍵盤驅動程式是乙個輸入輸出的裝置,但在reactos驅動程式分類裡,是分在輸入裝置類。這個驅動程式的源程式所在的目錄是在reactos/drivers/input/i8042prt目錄。在分析這個驅動程式,還是採用從程式執行過程來分析它的流程。那麼驅動程式載入執行的入口點在那裡呢?這是乙個最先要解決的問題,其實每個驅動程式都固定有乙個函式名稱driverentry,因此作業系統載入驅動程式時,就會找到這個入口函式,然後就調這個函式,就可以把驅動程式和作業系統核心聯絡在一起了,就可以呼叫驅動程式相關的功能了。在核心的i/o管理器裡是這樣呼叫這個函式的,如下:
#148 dprint("calling driver entrypoint at %p/n", initializationfunction);
#149 status = (*initializationfunction)(driverobject, registrypath);
通過核心的呼叫,就知道函式driverentry應具備兩個引數,第乙個引數是驅動程式物件,這是核心表示乙個驅動程式的物件。第二個引數是驅動程式檔案在登錄檔裡的路徑。因此,驅動程式入口函式,就寫成下面這樣:
#001 ntstatus ntapi
#002 driverentry(
#003 in pdriver_object driverobject,
#004 in punicode_string registrypath)
#005
初始化擴充套件分割槽記憶體。
#032 rtlzeromemory(driverextension, sizeof(i8042_driver_extension));
初始化擴充套件的裝置列表。
#033 keinitializespinlock(&driverextension->port.spinlock);
#034 initializelisthead(&driverextension->devicelisthead);
#035 keinitializespinlock(&driverextension->devicelistlock);
#036
拷貝登錄檔路徑。
#037 status = duplicateunicodestring(
#038 rtl_duplicate_unicode_string_null_terminate,
#039 registrypath,
#040 &driverextension->registrypath);
#041 if (!nt_success(status))
#042
#046
從登錄檔裡獲取驅動程式的資源分配。
#047 status = readregistryentries(registrypath, &driverextension->port.settings);
#048 if (!nt_success(status))
#049
#053
新增即插即用呼叫函式,以便建立這個驅動程式支援的裝置。
#054 driverobject->driverextension->adddevice = i8042adddevice;
指向驅動程式中處理序列i/o請求的函式,i/o管理器自動為驅動程式序列化多個i/o請求。
#055 driverobject->driverstartio = i8042startio;
#056
預設地初始化irp訊息為irpstub函式處理。
#057 for (i = 0; i <= irp_mj_maximum_function; i++)
#058 driverobject->majorfunction[i] = irpstub;
#059
指定irp訊息irp_mj_create的處理函式i8042create。
#060 driverobject->majorfunction[irp_mj_create] = i8042create;
清除分配資源的函式i8042cleanup。
#061 driverobject->majorfunction[irp_mj_cleanup] = i8042cleanup;
指定關閉裝置時,呼叫的函式i8042close。
#062 driverobject->majorfunction[irp_mj_close] = i8042close;
通過io操作函式i8042devicecontrol。
#063 driverobject->majorfunction[irp_mj_device_control] = i8042devicecontrol;
指定中斷處理函式i8042internaldevicecontrol。
#064 driverobject->majorfunction[irp_mj_internal_device_control] = i8042internaldevicecontrol;
指定即插即用時響應函式i8042pnp。
#065 driverobject->majorfunction[irp_mj_pnp] = i8042pnp;
#066
判斷驅動程式是否初始化安裝時執行,如果是初始化時就呼叫函式i8042addlegacykeyboard處理。
#067 if (isfirststagesetup())
#068 return i8042addlegacykeyboard(driverobject, registrypath);
#069
#070 return status_success;
#071 }
reactos作業系統實現 178
sendmessagew函式主要用來向視窗傳送訊息。下面就是它的實現 001 lresult winapi 002 sendmessagew hwnd wnd,003 uint msg,004 wparam wparam,005 lparam lparam 006 028 029 填寫訊息結構。03...
reactos作業系統實現 187
隨著全球化的發展,開發軟體都是面向多語言的環境。目前大多數程式都是採用不同字型來顯示不同語言的辦法,那麼有沒有一種更好的辦法,一種字型就可以解決全球語言的顯示呢?答案肯定的,它就是採用邏輯字型ms shell dlg和ms shell dlg2。比如開發應用程式時,就看到在資源裡可以設定ms she...
reactos作業系統實現 193
selectobject函式是將物件選定到指定的裝置場境中。具體實現 如下 001 hgdiobj 002 winapi 003 selectobject hdc hdc,004 hgdiobj hgdiobj 005 016 獲取選擇dc的物件正確的控制代碼。017 hgdiobj gdifixu...