2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test to validate section flags in ntoskrnl
5 * PROGRAMMER: Mark Jansen
11 typedef struct KnownSections
18 static struct KnownSections g_Sections
[] = {
21 IMAGE_SCN_CNT_CODE
| IMAGE_SCN_MEM_EXECUTE
| IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_NOT_PAGED
,
22 IMAGE_SCN_MEM_DISCARDABLE
26 IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_WRITE
| IMAGE_SCN_MEM_NOT_PAGED
,
27 IMAGE_SCN_MEM_DISCARDABLE
31 IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_MEM_READ
,
32 IMAGE_SCN_MEM_DISCARDABLE
36 IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_MEM_READ
,
37 IMAGE_SCN_MEM_DISCARDABLE
41 IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_MEM_DISCARDABLE
| IMAGE_SCN_MEM_READ
,
46 IMAGE_SCN_CNT_CODE
| IMAGE_SCN_MEM_DISCARDABLE
| IMAGE_SCN_MEM_EXECUTE
| IMAGE_SCN_MEM_READ
,
52 static char* Chr2Str(DWORD value
)
56 #define IFX(x) if( value & IMAGE_SCN_##x )\
58 if(buf[0]) { StringCchCatA(buf, _countof(buf), "|" ); }\
59 StringCchCatA(buf, _countof(buf), #x );\
60 value &= ~(IMAGE_SCN_##x);\
64 IFX(CNT_INITIALIZED_DATA
);
65 IFX(CNT_UNINITIALIZED_DATA
);
70 //IFX(NO_DEFER_SPEC_EXC);
84 //IFX(ALIGN_128BYTES);
85 //IFX(ALIGN_256BYTES);
86 //IFX(ALIGN_512BYTES);
87 //IFX(ALIGN_1024BYTES);
88 //IFX(ALIGN_2048BYTES);
89 //IFX(ALIGN_4096BYTES);
90 //IFX(ALIGN_8192BYTES);
101 StringCchPrintfA(buf
+ strlen(buf
), _countof(buf
) - strlen(buf
), "|0x%x", value
);
107 START_TEST(ntoskrnl_SectionFlags
)
111 GetSystemDirectoryA(buf
, _countof(buf
));
112 StringCchCatA(buf
, _countof(buf
), "\\ntoskrnl.exe");
114 mod
= LoadLibraryExA( buf
, NULL
, LOAD_LIBRARY_AS_DATAFILE
);
117 // we have to take into account that a datafile is not returned at the exact address it's loaded at.
118 PIMAGE_DOS_HEADER dos
= (PIMAGE_DOS_HEADER
)(((size_t)mod
) & (~0xf));
119 PIMAGE_NT_HEADERS nt
;
120 PIMAGE_SECTION_HEADER firstSection
;
123 if( dos
->e_magic
!= IMAGE_DOS_SIGNATURE
)
125 skip("Couldn't find ntoskrnl.exe dos header\n");
129 nt
= (PIMAGE_NT_HEADERS
)( ((PBYTE
)dos
) + dos
->e_lfanew
);
130 if( nt
->Signature
!= IMAGE_NT_SIGNATURE
)
132 skip("Couldn't find ntoskrnl.exe nt header\n");
136 firstSection
= IMAGE_FIRST_SECTION(nt
);
137 numSections
= nt
->FileHeader
.NumberOfSections
;
138 for( n
= 0; n
< numSections
; ++n
)
140 PIMAGE_SECTION_HEADER section
= firstSection
+ n
;
143 StringCchCopyNA(name
, _countof(name
), (PCSTR
)section
->Name
, 8);
145 for( i
= 0; g_Sections
[i
].Name
; ++i
)
147 if( !_strnicmp(name
, g_Sections
[i
].Name
, 8) )
149 if( g_Sections
[i
].Required
)
151 DWORD Flags
= g_Sections
[i
].Required
& section
->Characteristics
;
152 ok(Flags
== g_Sections
[i
].Required
,
153 "Missing required Characteristics on %s: %s\n",
154 name
, Chr2Str(Flags
^ g_Sections
[i
].Required
));
156 if( g_Sections
[i
].Disallowed
)
158 DWORD Flags
= g_Sections
[i
].Disallowed
& section
->Characteristics
;
159 ok(!Flags
, "Disallowed section Characteristics on %s: %s\n",
160 name
, Chr2Str(section
->Characteristics
));
170 skip("Couldn't load ntoskrnl.exe as datafile\n");