reactos作業系統實現 89

2021-08-24 19:41:26 字數 2985 閱讀 9202

鍵盤驅動程式是乙個最基本的驅動程式,通過學習這個簡單而實用的驅動程式來了解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...