2012-01-29 6 views
15

나는 파일을로드하고로드 된 파일 생성 날짜, 수정 날짜, 크기 등의 정보를 얻는 C# 프로그램을 개발 중입니다. 알아 두어야 할 또 다른 사항은로드 된 파일 (executable.exe)은 LARGEADDRESSAWARE 플래그로 연결됩니다. FileInfo 클래스는이 정보를 제공하지 않습니다.exe가 LARGEADDRESSAWARE로 설정되어 있는지 확인하는 방법

C#에서 주어진 executable.exe가 LARGEADDRESSAWARE 플래그 (2GB보다 큰 주소를 처리하기 위해)와 연결되어 있는지 어떻게 알 수 있습니까?

+2

는 "C 번호"등으로 제목을 접두사하지 마십시오. 그것이 바로 태그입니다. 또한, FYI,'FileInfo'는 C#의 일부가 아닙니다. 그것은 .NET의 일부입니다. –

+1

IMAGE_FILE_HEADER.Characteristics, IMAGE_FILE_LARGE_ADDRESS_AWARE 비트에 저장됩니다. http://msdn.microsoft.com/en-us/library/windows/desktop/ms680313%28v=vs.85%29.aspx –

답변

22

다음은 Large Address Aware 플래그를 확인하는 코드입니다. 실행 파일의 시작 부분을 가리키는 스트림을 전달하면됩니다.

윌의 대답에서
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/헤더는 그 취지의 정보를 표시한다.

프로그래밍 방식으로이 방법을 찾고 있다면 응용 프로그램에서 dumpbin을 호출하고 출력을 구문 분석 할 수 있습니다.

업데이트 :

도 더 깊이 문제에 대해 설명 좋은 블로그 게시물 here 있습니다.

+0

[이 답변] (https : //stackoverflow.com/a/6777574/25507)에는 큰 주소 인식을 확인하기 위해 dumpbin을 사용하는 방법에 대한 자세한 내용이 있습니다. –

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; 
    }