2012-01-29 19 views
15

के रूप में सेट किया गया है, मैं एक सी # प्रोग्राम विकसित कर रहा हूं जो फाइल लोड करेगा और लोड की गई फ़ाइल, दिनांक दिनांक, संशोधन दिनांक, आकार इत्यादि जैसी जानकारी प्राप्त करेगी। एक और चीज जिसे मुझे जानना है कि लोड की गई फ़ाइल है या नहीं (executable.exe) LARGEADDRESSAWARE ध्वज से जुड़ा हुआ है। FileInfo कक्षा इस जानकारी को प्रदान नहीं करती है।यह जांचने के लिए कि क्या EXE को LARGEADDRESSAWARE

क्या कोई जानता है कि सी # में मुझे पता चल सकता है कि दिया गया निष्पादन योग्य.एक्सई LARGEADDRESSAWARE ध्वज (2 जीबी से बड़े पते को संभालने के लिए) से जुड़ा हुआ है या नहीं?

+2

कृपया के साथ "सी #" और इस तरह अपने शीर्षकों उपसर्ग नहीं है। यही टैग है। इसके अलावा, एफवाईआई, 'फाइलइन्फो' सी # का हिस्सा नहीं है। यह .NET का हिस्सा है। –

+1

यह IMAGE_FILE_HEADER में संग्रहीत है। विशेषताएं, IMAGE_FILE_LARGE_ADDRESS_AWARE बिट: http://msdn.microsoft.com/en-us/library/windows/desktop/ms680313%28v=vs.85%29.aspx –

उत्तर

22

यहां कुछ कोड है जो बड़े पता जागरूकता ध्वज की जांच करता है। आपको बस एक धारा पारित करना है जो एक निष्पादन योग्य की शुरुआत की ओर इशारा करता है।

IsLargeAware("some.exe"); 

static bool IsLargeAware(string file) 
{ 
    using (var fs = File.OpenRead(file)) 
    { 
     return IsLargeAware(fs); 
    } 
} 
/// <summary> 
/// Checks if the stream is a MZ header and if it is large address aware 
/// </summary> 
/// <param name="stream">Stream to check, make sure its at the start of the MZ header</param> 
/// <exception cref=""></exception> 
/// <returns></returns> 
static bool IsLargeAware(Stream stream) 
{ 
    const int IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x20; 

    var br = new BinaryReader(stream); 

    if (br.ReadInt16() != 0x5A4D)  //No MZ Header 
     return false; 

    br.BaseStream.Position = 0x3C; 
    var peloc = br.ReadInt32();   //Get the PE header location. 

    br.BaseStream.Position = peloc; 
    if (br.ReadInt32() != 0x4550)  //No PE header 
     return false; 

    br.BaseStream.Position += 0x12; 
    return (br.ReadInt16() & IMAGE_FILE_LARGE_ADDRESS_AWARE) == IMAGE_FILE_LARGE_ADDRESS_AWARE; 
} 
+1

आपके अपडेट हाई के लिए बहुत धन्यवाद। यह वास्तव में मेरी समस्या हल हो गया। बहुत सराहना की। – harrygg

15

MSDN documentation/LARGEADDRESSAWARE के लिए कहता है:

तो एक आवेदन/LARGEADDRESSAWARE से जोड़ा जाता था, DUMPBIN/हेडर उस प्रभाव के लिए जानकारी प्रदर्शित करेगा।

यदि आप प्रोग्रामिंग के लिए ऐसा करने का कोई तरीका ढूंढ रहे हैं, तो आप अपने आवेदन से डंपबिन का आह्वान कर सकते हैं और आउटपुट को पार्स कर सकते हैं।

अद्यतन:

भी एक अच्छा ब्लॉग पोस्ट here कि और अधिक गहराई में इस मुद्दे पर चर्चा करता है।

+0

[यह उत्तर] (https : //stackoverflow.com/a/6777574/25507) बड़े पते को जागरूक करने के लिए डंपबिन का उपयोग करने के बारे में अधिक जानकारी है। –

1

विल के जवाब से ऊपर मैं उपयोग कर रहा हूँ मेरी 86 सेटअप पैकेज में निम्नलिखित:

static bool LargeAware(string file) { 
     using (var fs = File.Open(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { 
      bool b = LargeAware(fs); 
      fs.Close(); 
      return b; 
     } 
    } 

    const int IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x20; 
    static bool LargeAware(Stream stream) { 

     var br = new BinaryReader(stream); 
     var bw = new BinaryWriter(stream); 

     if (br.ReadInt16() != 0x5A4D)  //No MZ Header 
      return false; 

     br.BaseStream.Position = 0x3C; 
     var peloc = br.ReadInt32();   //Get the PE header location. 

     br.BaseStream.Position = peloc; 
     if (br.ReadInt32() != 0x4550)  //No PE header 
      return false; 

     br.BaseStream.Position += 0x12; 
     long nFilePos = (int)br.BaseStream.Position; 
     Int16 nLgaInt = br.ReadInt16(); 
     bool bIsLGA = (nLgaInt & IMAGE_FILE_LARGE_ADDRESS_AWARE) == IMAGE_FILE_LARGE_ADDRESS_AWARE; 
     if (bIsLGA) 
      return true; 
     nLgaInt |= IMAGE_FILE_LARGE_ADDRESS_AWARE; 
     long nFilePos1 = bw.Seek((int)nFilePos, SeekOrigin.Begin); 
     bw.Write(nLgaInt); 
     bw.Flush(); 
     long nFilePos2 = br.BaseStream.Seek(nFilePos, SeekOrigin.Begin); 
     nLgaInt = br.ReadInt16(); 
     bIsLGA = (nLgaInt & IMAGE_FILE_LARGE_ADDRESS_AWARE) == IMAGE_FILE_LARGE_ADDRESS_AWARE; 
     return bIsLGA; 
    } 
संबंधित मुद्दे