在系統裡user32.dll,kernel32.dll,shell32.dll,gdi32.dll,rpcrt4.dll,comctl32.dll,advapi32.dll,version.dll等dll代表了win32 api的基本提供者。win32 api中的所有呼叫最終都轉向了ntdll.dll,再由它**至ntoskrnl.exe。ntdll.dll是本機api使用者模式的終端。真正的介面在ntoskrnl.exe裡完成。事實上,核心模式的驅動大部分時間呼叫這個模組,如果它們請求系統服務。ntdll.dll的主要作用就是讓核心函式的特定子集可以被使用者模式下執行的程式呼叫。ntdll.dll通過軟體中斷int 2eh進入ntoskrnl.exe,就是通過中斷門切換cpu特權級。比如kernel32.dll匯出的函式deviceiocontrol()實際上呼叫ntdll.dll中匯出的ntdeviceiocontrolfile(),反彙編一下這個函式可以看到,eax載入magic數0x38,實際上是系統呼叫號,然後edx指向堆疊。目標位址是當前堆疊指標esp+4,所以edx指向返回位址後面乙個,也就是指向在進入ntdeviceiocontrolfile()之前存入堆疊的東西。事實上就是函式的引數。下乙個指令是int 2eh,轉到中斷描述符表idt位置0x2e處的中斷處理程式。
下面就來分析怎麼樣載入ntdll.dll,具體實現**始下:
#001 ntstatus
#002 ntapi
#003 pslocatesystemdll(void)
#004
#029
檢查ntdll.dll檔案是否合法。
#030 /* check if the image is valid */
#031 status = mmchecksystemimage(filehandle, true);
#032 if (status == status_image_checksum_mismatch)
#033
#044
為ntdll.dll檔案建立**和資料段。
#045 /* create a section for ntdll */
#046 status = zwcreatesection(§ionhandle,
#047 section_all_access,
#048 null,
#049 null,
#050 page_execute,
#051 sec_image,
#052 filehandle);
#053 zwclose(filehandle);
#054 if (!nt_success(status))
#055
#059
新增引用段物件。
#060 /* reference the section */
#061 status = obreferenceobjectbyhandle(sectionhandle,
#062 section_all_access,
#063 mmsectionobjecttype,
#064 kernelmode,
#065 (pvoid*)&pspsystemdllsection,
#066 null);
#067 zwclose(sectionhandle);
#068 if (!nt_success(status))
#069
#073
把ntdll.dll對映到核心空間。pspsystemdllbase是動態連線庫的基位址。
#074 /* map it */
#075 status = pspmapsystemdll(psgetcurrentprocess(), &pspsystemdllbase, false);
#076 if (!nt_success(status))
#077
#081
#082 /* return status */
#083 return status;
#084 }
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...