要添加Hans的答案,還有一些Windows內核模式代碼響應該標誌。每個加載的可執行文件都有一個與之關聯的內核結構,SECTION_IMAGE_INFORMATION
。下面是它的符號信息:
0: kd> dt nt!_SECTION_IMAGE_INFORMATION
+0x000 TransferAddress : Ptr64 Void
+0x008 ZeroBits : Uint4B
+0x010 MaximumStackSize : Uint8B
+0x018 CommittedStackSize : Uint8B
+0x020 SubSystemType : Uint4B
+0x024 SubSystemMinorVersion : Uint2B
+0x026 SubSystemMajorVersion : Uint2B
+0x024 SubSystemVersion : Uint4B
+0x028 GpValue : Uint4B
+0x02c ImageCharacteristics : Uint2B
+0x02e DllCharacteristics : Uint2B
+0x030 Machine : Uint2B
+0x032 ImageContainsCode : UChar
+0x033 ImageFlags : UChar
+0x033 ComPlusNativeReady : Pos 0, 1 Bit
+0x033 ComPlusILOnly : Pos 1, 1 Bit
+0x033 ImageDynamicallyRelocated : Pos 2, 1 Bit
+0x033 ImageMappedFlat : Pos 3, 1 Bit
+0x033 BaseBelow4gb : Pos 4, 1 Bit
+0x033 Reserved : Pos 5, 3 Bits
的標誌ComPlusILOnly
和ComPlusNativeReady
都涉及到.NET,ComPlusILOnly
只是告訴如果大會CIL只(不混合或本機 - 在這種情況下,大會已經是體系結構相關的),和ComPlusNativeReady
僅在未設置/ 32BIT +時才爲1(32BITREQ or 32BITPREF in newer CorFlags version)。在nt!PspAllocateProcess
期間檢查這些標誌,並基於它們創建32-bit
或64-bit
進程。
I wrote about it有一些細節。
感謝您的快速回答。這是一個很好的起點。我想知道clr如何處理.reloc部分。我在sscli中挖掘,主要是在pedecoder.h/pewriter.cpp中找到我的答案。仍然有很多問題(例如Windows 2000 x64),但我想我會在sscli中找到答案。 –
這是一個簡單的,Windows 2000 x64最後被看到由偉大的白色雪人使用。 –
哇。我想知道是否有任何方法可以利用這種「特殊意識」爲Windows創建適當的fat(本地代碼)二進制文件。 – Fowl