Reactos

[KMTESTS] Add compile time asserts for IO_STACK_LOCATION offsets CORE-14782

+72
+1
modules/rostests/kmtests/CMakeLists.txt
··· 31 31 list(APPEND KMTEST_DRV_SOURCE 32 32 kmtest_drv/guid.c 33 33 kmtest_drv/kmtest_drv.c 34 + kmtest_drv/structs.c 34 35 kmtest_drv/testlist.c 35 36 36 37 example/Example.c
+71
modules/rostests/kmtests/kmtest_drv/structs.c
··· 1 + /* 2 + * PROJECT: ReactOS kernel-mode tests 3 + * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+) 4 + * PURPOSE: Kernel-Mode Test Suite Struct alignment tests 5 + * COPYRIGHT: Copyright 2018 Mark Jansen (mark.jansen@reactos.org) 6 + */ 7 + 8 + #include <kmt_test.h> 9 + 10 + // When searching for the correct offset, 11 + // this will generate a compile-time error including the offset: 12 + // char (*__kaboom1)[FIELD_OFFSET(IO_STACK_LOCATION, Parameters.Create.EaLength)] = 1; 13 + // Taken from https://stackoverflow.com/a/35261673 14 + 15 + #if !defined(_AMD64_) 16 + 17 + C_ASSERT(sizeof(IO_STACK_LOCATION) == 36); 18 + 19 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, MajorFunction) == 0); 20 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, MinorFunction) == 1); 21 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Flags) == 2); 22 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Control) == 3); 23 + 24 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.Create.SecurityContext) == 4); 25 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.Create.Options) == 8); 26 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.Create.FileAttributes) == 12); 27 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.Create.ShareAccess) == 14); 28 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.Create.EaLength) == 16); 29 + 30 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.ReadWriteConfig.WhichSpace) == 4); 31 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.ReadWriteConfig.Buffer) == 8); 32 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.ReadWriteConfig.Offset) == 12); 33 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.ReadWriteConfig.Length) == 16); 34 + 35 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.Length) == 4); 36 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.FileInformationClass) == 8); 37 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.FileObject) == 12); 38 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.ReplaceIfExists) == 16); 39 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.AdvanceOnly) == 17); 40 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.ClusterCount) == 16); 41 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.DeleteHandle) == 16); 42 + 43 + #else 44 + 45 + C_ASSERT(sizeof(IO_STACK_LOCATION) == 72); 46 + 47 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, MajorFunction) == 0); 48 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, MinorFunction) == 1); 49 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Flags) == 2); 50 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Control) == 3); 51 + 52 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.Create.SecurityContext) == 8); 53 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.Create.Options) == 16); 54 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.Create.FileAttributes) == 24); 55 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.Create.ShareAccess) == 26); 56 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.Create.EaLength) == 32); 57 + 58 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.ReadWriteConfig.WhichSpace) == 8); 59 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.ReadWriteConfig.Buffer) == 16); 60 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.ReadWriteConfig.Offset) == 24); 61 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.ReadWriteConfig.Length) == 32); 62 + 63 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.Length) == 8); 64 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.FileInformationClass) == 16); 65 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.FileObject) == 24); 66 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.ReplaceIfExists) == 32); 67 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.AdvanceOnly) == 33); 68 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.ClusterCount) == 32); 69 + C_ASSERT(FIELD_OFFSET(IO_STACK_LOCATION, Parameters.SetFile.DeleteHandle) == 32); 70 + 71 + #endif