2013-07-16 24 views
22

Jaki jest format (układ danych) plików *.ni.dll.aux znalezionych w C:\Windows\assembly\NativeImages_v4.0.30319_64? Rozumiem, że są to pliki pomocnicze wygenerowane przez ngen.exe. Jakie dane zawierają?Jaki jest format plików `* .ni.dll.aux`?

+4

Niewiele w nim, po prostu lista wszystkich zespołów zależnych z rożnie danych dla każdy. To nie jest nigdzie udokumentowane, może mieć coś wspólnego z optymalizacjami platformy .NET 4.5, takimi jak optymalizacja kierowana profilem. Jaki problem próbujesz rozwiązać? –

+0

Czy to nie temat? – dhein

Odpowiedz

2

Analiza pokazuje, że jest to dość prosty format (jak wskazał Hans Passant). ma słowo typu, po którym następuje słowo długości na 3 poziomach: na poziomie pliku, poziomu rekordu i poziomu odniesienia (są to arbitralne terminy, których używam dla jasności).

to przegląd:

[email protected]:~/stackoverflow/17681514$ ./job.py System.Net.ni.dll.aux 
00000005 (00000204): 0b000000bc0000000d000000...00000000000000000000cccc 
0000000b (000000bc): 0d0000005000000053797374...00000000000000000000cccc 
    0000000d: (00000050) 'System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\x00\xcc\xcc' 
    00000007: (00000004) '\t\x11\x00\x00' 
    00000002: (00000008) '\x00i,\x03c]\xcd\x01' 
    00000008: (00000014) '\xf3\xd8#\x08\xf7\x08\x9a$1\x11\xb8\x18Rv\[email protected]\xa1y\xb2.' 
    0000000a: (00000024) '\x011.0.23-106002268\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc' 
00000004 (00000098): 010000004c0000006d73636f...00000000000000000000cccc 
    00000001: (0000004c) 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\x00' 
    00000003: (00000010) '\x9d\xa5\xbb3\xcd\x1c4\xb7\x85\x1c\x08\x8f\x0c\xf7I\xcc' 
    0000000a: (00000024) '\x011.0.23-106002119\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc' 
00000004 (00000098): 010000004c00000053797374...00000000000000000000cccc 
    00000001: (0000004c) 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\x00\xcc\xcc' 
    00000003: (00000010) '\xe30[\xdb\xd0>\xf9\x19\x05\x1a\xa7\xf2x:\xc3*' 
    0000000a: (00000024) '\x011.0.23-106003331\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc' 

tutaj jest skrypt (opracowany stopniowo), który zrzuca powyższego:

[email protected]:~/stackoverflow/17681514$ cat job.py 
#!/usr/bin/python 
import sys, os, struct 
def dump(infile): 
data = read(infile) 
filelength = len(data) 
filetype, length, data = next(data) 
assert filelength == length + 8 
print '%08x (%08x): %s' % (filetype, length, snippet(data)) 
lengthcheck = 8 
while data: 
    recordtype, recordlength, data = next(data) 
    lengthcheck += 8 + recordlength 
    #debug('remaining data: %s' % snippet(data)) 
    record, data = data[:recordlength], data[recordlength:] 
    print ' %08x (%08x): %s' % (recordtype, recordlength, snippet(record)) 
    recordcheck = 0 # not 8 because record header was already not counted 
    while record: 
    subrecordtype, subrecordlength, record = next(record) 
    recordcheck += 8 + subrecordlength 
    datum, record = record[:subrecordlength], record[subrecordlength:] 
    print ' %08x: (%08x) %s' % (subrecordtype, subrecordlength, repr(datum)) 
    assert recordcheck == recordlength 
assert lengthcheck == filelength 
def next(data): 
'each chunk is a type word followed by a length word' 
if not data: 
    typeword, length = 0, 0 
elif len(data) > 16: 
    typeword = struct.unpack('<I', data[:4])[0] 
    length = struct.unpack('<I', data[4:8])[0] 
else: 
    raise Exception('Invalid data length %d' % len(data)) 
return typeword, length, data[8:] 
def read(filename): 
input = open(filename, 'rb') 
data = input.read() 
input.close() 
return data 
def snippet(data): 
snippet = data[:12].encode('hex') 
if len(data) > 12: 
    snippet += '...' 
if len(data) > 24: 
    snippet += data[-12:].encode('hex') 
return snippet 
def debug(message): 
if __debug__: 
    if message: 
    print >>sys.stderr, message 
    return True 
if __name__ == '__main__': 
for infile in sys.argv[1:]: 
    dump(infile) 

każdy rekord ma 0xA typu subrecord który pojawia się numer wersji rodzaju. typ podrejestru 0x3 może być identyfikatorem GUID, sądząc po jego długości. typy 0x1 i 0xd mają charakter opisowy. Nie mam pojęcia, jakie mogą być typy podrzędne 0x7 i 0x2. być może 0x7 jest 32-bitowym przesunięciem do pasującego pliku .dll, ale 64-bitowa liczba w typie 0x2 nie sugeruje niczego szczególnego dla mnie. typ 0x8, długość 20 bajtów, może być typem skrótu. może inni mogą wypełnić puste miejsca.

wartości łańcuchowe, jak widać, kończą się wartościami 0x0 i 0xcccc. typ rekordu 0xa to głównie dane łańcuchowe, ale poprzedzone bajtem 0x1 i stałą długością 0x24, więc jest uzupełniony o dodatkowe 0x0. inne typy rekordów, ale nie wszystkie, również kończą się wartościami 0xcccc.

pliki zostały uzyskane przez google dla „index.of dll.aux” i znaleźć tutaj: http://www.badelement.co.uk/Movies/Storage/Win-7-Pro_64/Windows/assembly/NativeImages_v4.0.30319_64/System.Net/d79a634a4d873717e2dab52d827ba985/