即插即用(plug and play,pnp)是計算機系統i/o裝置與部件配置的應用技術。pnp就是指插入就可以使用,不需要進行任何的硬體配置。其實還是需要安裝相應的驅動程式才可以使用的。隨著人們對計算機使用多樣化,不斷地需要新增各種各樣的硬體卡到計算機的主機板上,這樣就需要配置硬體卡的中斷、i/o所占用的資源,才能正常工作。這個過程是非常複雜的,經常需要手工配置,還需要檢視計算機那裡中斷是空閒的,那些i/o埠是沒有占用的。使用pnp技術以後,只需要作業系統做統一分配就行了。下面就來分析pnp初始化的實現**:
#001 void init_function
#002 pnpinit(void)
#003
#017
#018 rtlzeromemory(iopbustypeguidlist, sizeof(io_bus_type_guid_list));
#019 exinitializefastmutex(&iopbustypeguidlist->lock);
#020
初始化即插即用的事件通知支援。
#021 /* initialize pnp-event notification support */
#022 status = iopinitplugplayevents();
#023 if (!nt_success(status))
#024
#028
建立乙個根裝置驅動程式節點,儲存在ioprootdriverobject裡面。
#029 /*
#030 * create root device node
#031 */
#032
#033 status = iopcreatedriver(null, pnpdriverinitializeempty, null, 0, 0, &ioprootdriverobject);
#034 if (!nt_success(status))
#035
#039
建立乙個檔案裝置控制器物件儲存到根驅動程式節點裡。
#040 status = iocreatedevice(ioprootdriverobject, 0, null, file_device_controller,
#041 0, false, &pdo);
#042 if (!nt_success(status))
#043
#047
建立乙個檔案裝置控制器物件節點。
#048 status = iopcreatedevicenode(null, pdo, null, &ioprootdevicenode);
#049 if (!nt_success(status))
#050
#054
設定這個檔案裝置節點名稱為htree//root//。
#055 if (!rtlcreateunicodestring(&ioprootdevicenode->instancepath,
#056 l"htree//root//0"))
#057
#061
報告這個裝置到使用者模式的pnp管理器。
#062 /* report the device to the user-mode pnp manager */
#063 iopqueuetargetdeviceevent(&guid_device_arrival,
#064 &ioprootdevicenode->instancepath);
#065
#066 ioprootdevicenode->physicaldeviceobject->flags |= do_bus_enumerated_device;
#067 pnprootdriverentry(ioprootdriverobject, null);
#068 ioprootdevicenode->physicaldeviceobject->flags &= ~do_device_initializing;
#069 ioprootdriverobject->driverextension->adddevice(
#070 ioprootdriverobject,
#071 ioprootdevicenode->physicaldeviceobject);
#072
下面開始把freeloader檢測到的硬體資訊移到登錄檔system/currentcontrolset/root/鍵裡。
#073 /* move information about devices detected by freeloader to system/currentcontrolset/root/ */
#074 status = iopupdaterootkey();
#075 if (!nt_success(status))
#076
#080 }
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...