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`?
Odpowiedz
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/
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ć? –
Czy to nie temat? – dhein