2012-04-30 31 views
10

Sanırım sorum şu CLR Yükleyici hakkında. CorFlags.exe/32BIT+ işlevselliğinin arkasındaki mekaniği anlamak istiyorum.CorFlags.exe/32BIT + nasıl çalışır?

Birisi, bir 64-bit Windows'ta ayarlanmış olan Herhangi bir CPU bayrağıyla derlendiğinde, 64 bitlik bir işlem olarak başladığını biliyoruz. Bu düzenekte bir CorFlags /32BIT+ varsa, 32 bitlik bir işlem olarak başlayacaktır. Bence bu büyüleyici bir özellik.

  • nasıl uygulandığı
      :

      bu konuda çok fazla soru var?

    1. İşletim Sistemi Yükleyicisi dahil mi?
    2. İstek üzerine 32 bit veya 64 bit CLR yükleyen özel bir uygulama oluşturmak (olası bir yönetilmeyen model) oluşturmak mümkün mü?

    Bu özelliğin iç çalışmalarını açıklayan bir makale, kitap, blog vb. Var mı?

  • cevap

    5

    Bu, bildiğim herhangi bir yerde iyi belgelenmemiş, sizi yalnızca ilgili bir MSDN makalesine yönlendirebilirim. Evet, varsayımınız doğru, Windows XP'deki yükleyici ve yönetilen yürütülebilir dosyalar hakkında farkındalık var. .NET yükleyici şimini (c: \ windows \ system32 \ mscoree.dll) otomatik olarak yükler, ilgili giriş noktası _CorValidateImage()'dur. bağlantılı MSDN makalesinde Açıklamalar bölümü 64 bit sürecine 32 bit .exe dosyasını açar mekanizmasını açıklar:

    Windows XP ve sonraki sürümleri, inceleyerek yönetilen modülleri için işletim sistemi yükleyici kontrolleri ise

    Ortak nesne dosya formatı (COFF) üstbilgisinde COM Tanımlayıcısı Dizini biti. Ayarlanmış bir bit yönetilen bir modülü gösterir. yükleyici yönetilen bir modülü tespit ederse, aşağıdaki eylemleri gerçekleştirir hangi MSCOREE.dll yükler ve _CorValidateImage çağırır:

    • görüntü geçerli bir yönetilen modül olduğunu onaylar.
    • Resimdeki giriş noktasını ortak dil çalışma zamanında (CLR) bir giriş noktasına değiştirir.
    • Windows'un 64 bit sürümleri için, bellekte görüntüyü PE32'den PE32 + biçimine dönüştürerek değiştirir.
    • Yönetilen modül görüntüleri yüklendiğinde, yükleyiciye geri döner. çalıştırılabilir görüntüler için

    , işletim sistemi yükleyici sonra ne olursa olsun yürütülebilir belirtilen giriş noktasının, _CorExeMain işlevini çağırır. DLL derleme görüntüleri için, yükleyici _CorDllMain işlevini çağırır.

    _CorExeMain veya _CorDllMain aşağıdaki eylemleri gerçekleştirir:

    • CLR başlatır.
    • Yönetilen giriş noktasını derlemenin CLR başlığından bulur.
    • Yürütmeyi başlatır.

    Yükleyici, yönetilen modül görüntüleri kaldırıldığında _CorImageUnloading işlevini çağırır.Ancak, bu işlev hiçbir eylemi gerçekleştirmez; sadece geri döner.

    +0

    Hızlı cevap için teşekkürler. Bu iyi bir başlangıç ​​noktasıdır. Clrel'in .reloc bölümleriyle nasıl çalıştığını öğrenmek istedim. Ben çoğunlukla pedecoder.h/pewriter.cpp içinde sscli kazdık ve cevaplarımı buldum. Hala birçok soru var (örneğin, Windows 2000 x64 hakkında) ama sanırım cevapları sscli'de bulabilirim. –

    +0

    Bu kolay bir, Windows 2000 x64 en son Yeti'nin beyaz tarafından kullanıldığı görülüyor. –

    +1

    Vay. Windows için uygun yağ (yerel kod) ikili dosyaları oluşturmak için bu "özel farkındalık" dan yararlanmak için herhangi bir yolu olup olmadığını merak ediyorum. – Fowl

    2

    Hans'ın cevabını eklemek için, o bayrağa yanıt veren bazı Windows çekirdek modu kodu da vardır. Yüklenen her yürütülebilir dosya, onunla ilişkili SECTION_IMAGE_INFORMATION çekirdek yapısına sahiptir. İşte sembol bilgiler aşağıda belirtilmiştir:

    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 ve ComPlusNativeReady .NET ile ilgili bayraklar, ComPlusILOnly basitçe montaj sadece (karma veya yerli olmayan - montaj zaten mimari özgüdür bu durumda) CIL ise söyler ve ComPlusNativeReady yalnızca 1/32BIT + ayarlanmamışsa 1'dir (32BITREQ or 32BITPREF in newer CorFlags version). Bu bayraklar nt!PspAllocateProcess sırasında kontrol edilir ve bir 32-bit veya 64-bit işleminin oluşturulmasına dayanır. Bazı detaylar ile birlikte

    I wrote about it.

    +0

    Çok teşekkürler! Windows NT/2000 Yerel API Başvurusu'nda geçersiz kılınan bilgileri kullanarak bu alanın bazı ofsetlerini hesaplamada kafam karıştı. –