Ich versuche gerade die Aufrufparameter in einem Windows Kernel Treiber
im IoControlEvent zu analysieren.Dort bekomme unter anderem eine
C-Struktur mit Parametern übergeben von der ich keine Information über
die Struktur und ihre Variablen habe. Ich habe nur die Gesamt-Länge der
Struktur und kenne Variable die sie enthalten muss.
1 | // structur definition aus Beispielen passt nicht
|
2 | typedef struct _ASYNC_READ_ORG {
|
3 | ULONG bRawMode;
|
4 | ULONG bGetGeneration;
|
5 | IO_ADDRESS DestinationAddress; //BusNr NodeNr Ofset-hi offset-Low
|
6 | ULONG nNumberOfBytesToRead;
|
7 | ULONG nBlockSize;
|
8 | ULONG fulFlags;
|
9 | ULONG ulGeneration;
|
10 | UCHAR Data[1];
|
11 | } ASYNC_READ_ORG, *PASYNC_READ_ORG;
|
12 |
|
13 | // dummy structur für meinen memory dump
|
14 | typedef struct _ASYNC_READ_DBG {
|
15 | ULONG w1;
|
16 | ULONG w2;
|
17 | ULONG w3;
|
18 | ULONG w4;
|
19 | ULONG w5;
|
20 | ULONG w6;
|
21 | } ASYNC_READ_DBG, *PASYNC_READ_DBG;
|
22 |
|
23 | // der hexdump (little endian)
|
24 | FFFFCEFF
|
25 | 000400F0
|
26 | 10FBDB02
|
27 | 00000000
|
28 | 00040000
|
29 | 00000000
|
30 | // reihenfolge im speicher (big endian)
|
31 | FFCEFFFF
|
32 | F0000400
|
33 | 02DBFB10
|
34 | 00000000
|
35 | 00000400
|
36 | 00000000
|
37 |
|
38 | BYTE Reihenfolgen die Sinn ergeben
|
39 | FFCE -> BUS_NODE 10bit BusNr=0x3FF + 6Bit NodeNr=0x0E
|
40 | FFFF -> OffsetHigh
|
41 | F0000400 -> Offset Low
|
42 | 00000400 -> nNumberOfBytesToRead
|
43 |
|
44 | // so müsste die Struktur ohne padding aussehen
|
45 | typedef struct _ASYNC_READ {
|
46 | USHORT Bus_Node;
|
47 | USHORT OffsetHigh;
|
48 | ULONG OffsetLow;
|
49 | UCHAR x1;
|
50 | UCHAR x2;
|
51 | UCHAR x3;
|
52 | ULONG nNumberOfBytesToRead;
|
53 | ULONG x4;
|
54 | UCHAR x5;
|
55 | } ASYNC_READ, *PASYNC_READ;
|
Wenn ich die Variablen so ausgebe ist BusNode und OffsetHigh vertauscht,
OffsetLow stimmt, und nNumberOfBytesToRead = 0.
Frage wie müsste die Struktur mit padding aussehen ?
Ein 3byte padding hätte ich doch nur wenn auf ein UCHAR ein ULONG folgt
oder ?