import argparse
import os
import platform
import subprocess
KERNEL32_XP_SP2_EXPORT_SYMBOLS = [
"ActivateActCtx",
"AddAtomA",
"AddAtomW",
"AddConsoleAliasA",
"AddConsoleAliasW",
"AddLocalAlternateComputerNameA",
"AddLocalAlternateComputerNameW",
"AddRefActCtx",
"AddVectoredExceptionHandler",
"AllocConsole",
"AllocateUserPhysicalPages",
"AreFileApisANSI",
"AssignProcessToJobObject",
"AttachConsole",
"BackupRead",
"BackupSeek",
"BackupWrite",
"BaseCheckAppcompatCache",
"BaseCleanupAppcompatCache",
"BaseCleanupAppcompatCacheSupport",
"BaseDumpAppcompatCache",
"BaseFlushAppcompatCache",
"BaseInitAppcompatCache",
"BaseInitAppcompatCacheSupport",
"BaseProcessInitPostImport",
"BaseQueryModuleData",
"BaseUpdateAppcompatCache",
"BasepCheckWinSaferRestrictions",
"Beep",
"BeginUpdateResourceA",
"BeginUpdateResourceW",
"BindIoCompletionCallback",
"BuildCommDCBA",
"BuildCommDCBAndTimeoutsA",
"BuildCommDCBAndTimeoutsW",
"BuildCommDCBW",
"CallNamedPipeA",
"CallNamedPipeW",
"CancelDeviceWakeupRequest",
"CancelIo",
"CancelTimerQueueTimer",
"CancelWaitableTimer",
"ChangeTimerQueueTimer",
"CheckNameLegalDOS8Dot3A",
"CheckNameLegalDOS8Dot3W",
"CheckRemoteDebuggerPresent",
"ClearCommBreak",
"ClearCommError",
"CloseConsoleHandle",
"CloseHandle",
"CloseProfileUserMapping",
"CmdBatNotification",
"CommConfigDialogA",
"CommConfigDialogW",
"CompareFileTime",
"CompareStringA",
"CompareStringW",
"ConnectNamedPipe",
"ConsoleMenuControl",
"ContinueDebugEvent",
"ConvertDefaultLocale",
"ConvertFiberToThread",
"ConvertThreadToFiber",
"CopyFileA",
"CopyFileExA",
"CopyFileExW",
"CopyFileW",
"CopyLZFile",
"CreateActCtxA",
"CreateActCtxW",
"CreateConsoleScreenBuffer",
"CreateDirectoryA",
"CreateDirectoryExA",
"CreateDirectoryExW",
"CreateDirectoryW",
"CreateEventA",
"CreateEventW",
"CreateFiber",
"CreateFiberEx",
"CreateFileA",
"CreateFileMappingA",
"CreateFileMappingW",
"CreateFileW",
"CreateHardLinkA",
"CreateHardLinkW",
"CreateIoCompletionPort",
"CreateJobObjectA",
"CreateJobObjectW",
"CreateJobSet",
"CreateMailslotA",
"CreateMailslotW",
"CreateMemoryResourceNotification",
"CreateMutexA",
"CreateMutexW",
"CreateNamedPipeA",
"CreateNamedPipeW",
"CreateNlsSecurityDescriptor",
"CreatePipe",
"CreateProcessA",
"CreateProcessInternalA",
"CreateProcessInternalW",
"CreateProcessInternalWSecure",
"CreateProcessW",
"CreateRemoteThread",
"CreateSemaphoreA",
"CreateSemaphoreW",
"CreateSocketHandle",
"CreateTapePartition",
"CreateThread",
"CreateTimerQueue",
"CreateTimerQueueTimer",
"CreateToolhelp32Snapshot",
"CreateVirtualBuffer",
"CreateWaitableTimerA",
"CreateWaitableTimerW",
"DeactivateActCtx",
"DebugActiveProcess",
"DebugActiveProcessStop",
"DebugBreak",
"DebugBreakProcess",
"DebugSetProcessKillOnExit",
"DecodePointer",
"DecodeSystemPointer",
"DefineDosDeviceA",
"DefineDosDeviceW",
"DelayLoadFailureHook",
"DeleteAtom",
"DeleteCriticalSection",
"DeleteFiber",
"DeleteFileA",
"DeleteFileW",
"DeleteTimerQueue",
"DeleteTimerQueueEx",
"DeleteTimerQueueTimer",
"DeleteVolumeMountPointA",
"DeleteVolumeMountPointW",
"DeviceIoControl",
"DisableThreadLibraryCalls",
"DisconnectNamedPipe",
"DnsHostnameToComputerNameA",
"DnsHostnameToComputerNameW",
"DosDateTimeToFileTime",
"DosPathToSessionPathA",
"DosPathToSessionPathW",
"DuplicateConsoleHandle",
"DuplicateHandle",
"EncodePointer",
"EncodeSystemPointer",
"EndUpdateResourceA",
"EndUpdateResourceW",
"EnterCriticalSection",
"EnumCalendarInfoA",
"EnumCalendarInfoExA",
"EnumCalendarInfoExW",
"EnumCalendarInfoW",
"EnumDateFormatsA",
"EnumDateFormatsExA",
"EnumDateFormatsExW",
"EnumDateFormatsW",
"EnumLanguageGroupLocalesA",
"EnumLanguageGroupLocalesW",
"EnumResourceLanguagesA",
"EnumResourceLanguagesW",
"EnumResourceNamesA",
"EnumResourceNamesW",
"EnumResourceTypesA",
"EnumResourceTypesW",
"EnumSystemCodePagesA",
"EnumSystemCodePagesW",
"EnumSystemGeoID",
"EnumSystemLanguageGroupsA",
"EnumSystemLanguageGroupsW",
"EnumSystemLocalesA",
"EnumSystemLocalesW",
"EnumTimeFormatsA",
"EnumTimeFormatsW",
"EnumUILanguagesA",
"EnumUILanguagesW",
"EnumerateLocalComputerNamesA",
"EnumerateLocalComputerNamesW",
"EraseTape",
"EscapeCommFunction",
"ExitProcess",
"ExitThread",
"ExitVDM",
"ExpandEnvironmentStringsA",
"ExpandEnvironmentStringsW",
"ExpungeConsoleCommandHistoryA",
"ExpungeConsoleCommandHistoryW",
"ExtendVirtualBuffer",
"FatalAppExitA",
"FatalAppExitW",
"FatalExit",
"FileTimeToDosDateTime",
"FileTimeToLocalFileTime",
"FileTimeToSystemTime",
"FillConsoleOutputAttribute",
"FillConsoleOutputCharacterA",
"FillConsoleOutputCharacterW",
"FindActCtxSectionGuid",
"FindActCtxSectionStringA",
"FindActCtxSectionStringW",
"FindAtomA",
"FindAtomW",
"FindClose",
"FindCloseChangeNotification",
"FindFirstChangeNotificationA",
"FindFirstChangeNotificationW",
"FindFirstFileA",
"FindFirstFileExA",
"FindFirstFileExW",
"FindFirstFileW",
"FindFirstVolumeA",
"FindFirstVolumeMountPointA",
"FindFirstVolumeMountPointW",
"FindFirstVolumeW",
"FindNextChangeNotification",
"FindNextFileA",
"FindNextFileW",
"FindNextVolumeA",
"FindNextVolumeMountPointA",
"FindNextVolumeMountPointW",
"FindNextVolumeW",
"FindResourceA",
"FindResourceExA",
"FindResourceExW",
"FindResourceW",
"FindVolumeClose",
"FindVolumeMountPointClose",
"FlushConsoleInputBuffer",
"FlushFileBuffers",
"FlushInstructionCache",
"FlushViewOfFile",
"FoldStringA",
"FoldStringW",
"FormatMessageA",
"FormatMessageW",
"FreeConsole",
"FreeEnvironmentStringsA",
"FreeEnvironmentStringsW",
"FreeLibrary",
"FreeLibraryAndExitThread",
"FreeResource",
"FreeUserPhysicalPages",
"FreeVirtualBuffer",
"GenerateConsoleCtrlEvent",
"GetACP",
"GetAtomNameA",
"GetAtomNameW",
"GetBinaryType",
"GetBinaryTypeA",
"GetBinaryTypeW",
"GetCPFileNameFromRegistry",
"GetCPInfo",
"GetCPInfoExA",
"GetCPInfoExW",
"GetCalendarInfoA",
"GetCalendarInfoW",
"GetComPlusPackageInstallStatus",
"GetCommConfig",
"GetCommMask",
"GetCommModemStatus",
"GetCommProperties",
"GetCommState",
"GetCommTimeouts",
"GetCommandLineA",
"GetCommandLineW",
"GetCompressedFileSizeA",
"GetCompressedFileSizeW",
"GetComputerNameA",
"GetComputerNameExA",
"GetComputerNameExW",
"GetComputerNameW",
"GetConsoleAliasA",
"GetConsoleAliasExesA",
"GetConsoleAliasExesLengthA",
"GetConsoleAliasExesLengthW",
"GetConsoleAliasExesW",
"GetConsoleAliasW",
"GetConsoleAliasesA",
"GetConsoleAliasesLengthA",
"GetConsoleAliasesLengthW",
"GetConsoleAliasesW",
"GetConsoleCP",
"GetConsoleCharType",
"GetConsoleCommandHistoryA",
"GetConsoleCommandHistoryLengthA",
"GetConsoleCommandHistoryLengthW",
"GetConsoleCommandHistoryW",
"GetConsoleCursorInfo",
"GetConsoleCursorMode",
"GetConsoleDisplayMode",
"GetConsoleFontInfo",
"GetConsoleFontSize",
"GetConsoleHardwareState",
"GetConsoleInputExeNameA",
"GetConsoleInputExeNameW",
"GetConsoleInputWaitHandle",
"GetConsoleKeyboardLayoutNameA",
"GetConsoleKeyboardLayoutNameW",
"GetConsoleMode",
"GetConsoleNlsMode",
"GetConsoleOutputCP",
"GetConsoleProcessList",
"GetConsoleScreenBufferInfo",
"GetConsoleSelectionInfo",
"GetConsoleTitleA",
"GetConsoleTitleW",
"GetConsoleWindow",
"GetCurrencyFormatA",
"GetCurrencyFormatW",
"GetCurrentActCtx",
"GetCurrentConsoleFont",
"GetCurrentDirectoryA",
"GetCurrentDirectoryW",
"GetCurrentProcess",
"GetCurrentProcessId",
"GetCurrentThread",
"GetCurrentThreadId",
"GetDateFormatA",
"GetDateFormatW",
"GetDefaultCommConfigA",
"GetDefaultCommConfigW",
"GetDefaultSortkeySize",
"GetDevicePowerState",
"GetDiskFreeSpaceA",
"GetDiskFreeSpaceExA",
"GetDiskFreeSpaceExW",
"GetDiskFreeSpaceW",
"GetDllDirectoryA",
"GetDllDirectoryW",
"GetDriveTypeA",
"GetDriveTypeW",
"GetEnvironmentStrings",
"GetEnvironmentStringsA",
"GetEnvironmentStringsW",
"GetEnvironmentVariableA",
"GetEnvironmentVariableW",
"GetExitCodeProcess",
"GetExitCodeThread",
"GetExpandedNameA",
"GetExpandedNameW",
"GetFileAttributesA",
"GetFileAttributesExA",
"GetFileAttributesExW",
"GetFileAttributesW",
"GetFileInformationByHandle",
"GetFileSize",
"GetFileSizeEx",
"GetFileTime",
"GetFileType",
"GetFirmwareEnvironmentVariableA",
"GetFirmwareEnvironmentVariableW",
"GetFullPathNameA",
"GetFullPathNameW",
"GetGeoInfoA",
"GetGeoInfoW",
"GetHandleContext",
"GetHandleInformation",
"GetLargestConsoleWindowSize",
"GetLastError",
"GetLinguistLangSize",
"GetLocalTime",
"GetLocaleInfoA",
"GetLocaleInfoW",
"GetLogicalDriveStringsA",
"GetLogicalDriveStringsW",
"GetLogicalDrives",
"GetLongPathNameA",
"GetLongPathNameW",
"GetMailslotInfo",
"GetModuleFileNameA",
"GetModuleFileNameW",
"GetModuleHandleA",
"GetModuleHandleExA",
"GetModuleHandleExW",
"GetModuleHandleW",
"GetNamedPipeHandleStateA",
"GetNamedPipeHandleStateW",
"GetNamedPipeInfo",
"GetNativeSystemInfo",
"GetNextVDMCommand",
"GetNlsSectionName",
"GetNumaAvailableMemory",
"GetNumaAvailableMemoryNode",
"GetNumaHighestNodeNumber",
"GetNumaNodeProcessorMask",
"GetNumaProcessorMap",
"GetNumaProcessorNode",
"GetNumberFormatA",
"GetNumberFormatW",
"GetNumberOfConsoleFonts",
"GetNumberOfConsoleInputEvents",
"GetNumberOfConsoleMouseButtons",
"GetOEMCP",
"GetOverlappedResult",
"GetPriorityClass",
"GetPrivateProfileIntA",
"GetPrivateProfileIntW",
"GetPrivateProfileSectionA",
"GetPrivateProfileSectionNamesA",
"GetPrivateProfileSectionNamesW",
"GetPrivateProfileSectionW",
"GetPrivateProfileStringA",
"GetPrivateProfileStringW",
"GetPrivateProfileStructA",
"GetPrivateProfileStructW",
"GetProcAddress",
"GetProcessAffinityMask",
"GetProcessHandleCount",
"GetProcessHeap",
"GetProcessHeaps",
"GetProcessId",
"GetProcessIoCounters",
"GetProcessPriorityBoost",
"GetProcessShutdownParameters",
"GetProcessTimes",
"GetProcessVersion",
"GetProcessWorkingSetSize",
"GetProfileIntA",
"GetProfileIntW",
"GetProfileSectionA",
"GetProfileSectionW",
"GetProfileStringA",
"GetProfileStringW",
"GetQueuedCompletionStatus",
"GetShortPathNameA",
"GetShortPathNameW",
"GetStartupInfoA",
"GetStartupInfoW",
"GetStdHandle",
"GetStringTypeA",
"GetStringTypeExA",
"GetStringTypeExW",
"GetStringTypeW",
"GetSystemDefaultLCID",
"GetSystemDefaultLangID",
"GetSystemDefaultUILanguage",
"GetSystemDirectoryA",
"GetSystemDirectoryW",
"GetSystemInfo",
"GetSystemPowerStatus",
"GetSystemRegistryQuota",
"GetSystemTime",
"GetSystemTimeAdjustment",
"GetSystemTimeAsFileTime",
"GetSystemTimes",
"GetSystemWindowsDirectoryA",
"GetSystemWindowsDirectoryW",
"GetSystemWow64DirectoryA",
"GetSystemWow64DirectoryW",
"GetTapeParameters",
"GetTapePosition",
"GetTapeStatus",
"GetTempFileNameA",
"GetTempFileNameW",
"GetTempPathA",
"GetTempPathW",
"GetThreadContext",
"GetThreadIOPendingFlag",
"GetThreadLocale",
"GetThreadPriority",
"GetThreadPriorityBoost",
"GetThreadSelectorEntry",
"GetThreadTimes",
"GetTickCount",
"GetTimeFormatA",
"GetTimeFormatW",
"GetTimeZoneInformation",
"GetUserDefaultLCID",
"GetUserDefaultLangID",
"GetUserDefaultUILanguage",
"GetUserGeoID",
"GetVDMCurrentDirectories",
"GetVersion",
"GetVersionExA",
"GetVersionExW",
"GetVolumeInformationA",
"GetVolumeInformationW",
"GetVolumeNameForVolumeMountPointA",
"GetVolumeNameForVolumeMountPointW",
"GetVolumePathNameA",
"GetVolumePathNameW",
"GetVolumePathNamesForVolumeNameA",
"GetVolumePathNamesForVolumeNameW",
"GetWindowsDirectoryA",
"GetWindowsDirectoryW",
"GetWriteWatch",
"GlobalAddAtomA",
"GlobalAddAtomW",
"GlobalAlloc",
"GlobalCompact",
"GlobalDeleteAtom",
"GlobalFindAtomA",
"GlobalFindAtomW",
"GlobalFix",
"GlobalFlags",
"GlobalFree",
"GlobalGetAtomNameA",
"GlobalGetAtomNameW",
"GlobalHandle",
"GlobalLock",
"GlobalMemoryStatus",
"GlobalMemoryStatusEx",
"GlobalReAlloc",
"GlobalSize",
"GlobalUnWire",
"GlobalUnfix",
"GlobalUnlock",
"GlobalWire",
"Heap32First",
"Heap32ListFirst",
"Heap32ListNext",
"Heap32Next",
"HeapAlloc",
"HeapCompact",
"HeapCreate",
"HeapCreateTagsW",
"HeapDestroy",
"HeapExtend",
"HeapFree",
"HeapLock",
"HeapQueryInformation",
"HeapQueryTagW",
"HeapReAlloc",
"HeapSetInformation",
"HeapSize",
"HeapSummary",
"HeapUnlock",
"HeapUsage",
"HeapValidate",
"HeapWalk",
"InitAtomTable",
"InitializeCriticalSection",
"InitializeCriticalSectionAndSpinCount",
"InitializeSListHead",
"InterlockedCompareExchange",
"InterlockedDecrement",
"InterlockedExchange",
"InterlockedExchangeAdd",
"InterlockedFlushSList",
"InterlockedIncrement",
"InterlockedPopEntrySList",
"InterlockedPushEntrySList",
"InvalidateConsoleDIBits",
"IsBadCodePtr",
"IsBadHugeReadPtr",
"IsBadHugeWritePtr",
"IsBadReadPtr",
"IsBadStringPtrA",
"IsBadStringPtrW",
"IsBadWritePtr",
"IsDBCSLeadByte",
"IsDBCSLeadByteEx",
"IsDebuggerPresent",
"IsProcessInJob",
"IsProcessorFeaturePresent",
"IsSystemResumeAutomatic",
"IsValidCodePage",
"IsValidLanguageGroup",
"IsValidLocale",
"IsValidUILanguage",
"IsWow64Process",
"LCMapStringA",
"LCMapStringW",
"LZClose",
"LZCloseFile",
"LZCopy",
"LZCreateFileW",
"LZDone",
"LZInit",
"LZOpenFileA",
"LZOpenFileW",
"LZRead",
"LZSeek",
"LZStart",
"LeaveCriticalSection",
"LoadLibraryA",
"LoadLibraryExA",
"LoadLibraryExW",
"LoadLibraryW",
"LoadModule",
"LoadResource",
"LocalAlloc",
"LocalCompact",
"LocalFileTimeToFileTime",
"LocalFlags",
"LocalFree",
"LocalHandle",
"LocalLock",
"LocalReAlloc",
"LocalShrink",
"LocalSize",
"LocalUnlock",
"LockFile",
"LockFileEx",
"LockResource",
"MapUserPhysicalPages",
"MapUserPhysicalPagesScatter",
"MapViewOfFile",
"MapViewOfFileEx",
"Module32First",
"Module32FirstW",
"Module32Next",
"Module32NextW",
"MoveFileA",
"MoveFileExA",
"MoveFileExW",
"MoveFileW",
"MoveFileWithProgressA",
"MoveFileWithProgressW",
"MulDiv",
"MultiByteToWideChar",
"NlsConvertIntegerToString",
"NlsGetCacheUpdateCount",
"NlsResetProcessLocale",
"NumaVirtualQueryNode",
"OpenConsoleW",
"OpenDataFile",
"OpenEventA",
"OpenEventW",
"OpenFile",
"OpenFileMappingA",
"OpenFileMappingW",
"OpenJobObjectA",
"OpenJobObjectW",
"OpenMutexA",
"OpenMutexW",
"OpenProcess",
"OpenProfileUserMapping",
"OpenSemaphoreA",
"OpenSemaphoreW",
"OpenThread",
"OpenWaitableTimerA",
"OpenWaitableTimerW",
"OutputDebugStringA",
"OutputDebugStringW",
"PeekConsoleInputA",
"PeekConsoleInputW",
"PeekNamedPipe",
"PostQueuedCompletionStatus",
"PrepareTape",
"PrivCopyFileExW",
"PrivMoveFileIdentityW",
"Process32First",
"Process32FirstW",
"Process32Next",
"Process32NextW",
"ProcessIdToSessionId",
"PulseEvent",
"PurgeComm",
"QueryActCtxW",
"QueryDepthSList",
"QueryDosDeviceA",
"QueryDosDeviceW",
"QueryInformationJobObject",
"QueryMemoryResourceNotification",
"QueryPerformanceCounter",
"QueryPerformanceFrequency",
"QueryWin31IniFilesMappedToRegistry",
"QueueUserAPC",
"QueueUserWorkItem",
"RaiseException",
"ReadConsoleA",
"ReadConsoleInputA",
"ReadConsoleInputExA",
"ReadConsoleInputExW",
"ReadConsoleInputW",
"ReadConsoleOutputA",
"ReadConsoleOutputAttribute",
"ReadConsoleOutputCharacterA",
"ReadConsoleOutputCharacterW",
"ReadConsoleOutputW",
"ReadConsoleW",
"ReadDirectoryChangesW",
"ReadFile",
"ReadFileEx",
"ReadFileScatter",
"ReadProcessMemory",
"RegisterConsoleIME",
"RegisterConsoleOS2",
"RegisterConsoleVDM",
"RegisterWaitForInputIdle",
"RegisterWaitForSingleObject",
"RegisterWaitForSingleObjectEx",
"RegisterWowBaseHandlers",
"RegisterWowExec",
"ReleaseActCtx",
"ReleaseMutex",
"ReleaseSemaphore",
"RemoveDirectoryA",
"RemoveDirectoryW",
"RemoveLocalAlternateComputerNameA",
"RemoveLocalAlternateComputerNameW",
"RemoveVectoredExceptionHandler",
"ReplaceFile",
"ReplaceFileA",
"ReplaceFileW",
"RequestDeviceWakeup",
"RequestWakeupLatency",
"ResetEvent",
"ResetWriteWatch",
"RestoreLastError",
"ResumeThread",
"RtlCaptureContext",
"RtlCaptureStackBackTrace",
"RtlFillMemory",
"RtlMoveMemory",
"RtlUnwind",
"RtlZeroMemory",
"ScrollConsoleScreenBufferA",
"ScrollConsoleScreenBufferW",
"SearchPathA",
"SearchPathW",
"SetCPGlobal",
"SetCalendarInfoA",
"SetCalendarInfoW",
"SetClientTimeZoneInformation",
"SetComPlusPackageInstallStatus",
"SetCommBreak",
"SetCommConfig",
"SetCommMask",
"SetCommState",
"SetCommTimeouts",
"SetComputerNameA",
"SetComputerNameExA",
"SetComputerNameExW",
"SetComputerNameW",
"SetConsoleActiveScreenBuffer",
"SetConsoleCP",
"SetConsoleCommandHistoryMode",
"SetConsoleCtrlHandler",
"SetConsoleCursor",
"SetConsoleCursorInfo",
"SetConsoleCursorMode",
"SetConsoleCursorPosition",
"SetConsoleDisplayMode",
"SetConsoleFont",
"SetConsoleHardwareState",
"SetConsoleIcon",
"SetConsoleInputExeNameA",
"SetConsoleInputExeNameW",
"SetConsoleKeyShortcuts",
"SetConsoleLocalEUDC",
"SetConsoleMaximumWindowSize",
"SetConsoleMenuClose",
"SetConsoleMode",
"SetConsoleNlsMode",
"SetConsoleNumberOfCommandsA",
"SetConsoleNumberOfCommandsW",
"SetConsoleOS2OemFormat",
"SetConsoleOutputCP",
"SetConsolePalette",
"SetConsoleScreenBufferSize",
"SetConsoleTextAttribute",
"SetConsoleTitleA",
"SetConsoleTitleW",
"SetConsoleWindowInfo",
"SetCriticalSectionSpinCount",
"SetCurrentDirectoryA",
"SetCurrentDirectoryW",
"SetDefaultCommConfigA",
"SetDefaultCommConfigW",
"SetDllDirectoryA",
"SetDllDirectoryW",
"SetEndOfFile",
"SetEnvironmentVariableA",
"SetEnvironmentVariableW",
"SetErrorMode",
"SetEvent",
"SetFileApisToANSI",
"SetFileApisToOEM",
"SetFileAttributesA",
"SetFileAttributesW",
"SetFilePointer",
"SetFilePointerEx",
"SetFileShortNameA",
"SetFileShortNameW",
"SetFileTime",
"SetFileValidData",
"SetFirmwareEnvironmentVariableA",
"SetFirmwareEnvironmentVariableW",
"SetHandleContext",
"SetHandleCount",
"SetHandleInformation",
"SetInformationJobObject",
"SetLastConsoleEventActive",
"SetLastError",
"SetLocalPrimaryComputerNameA",
"SetLocalPrimaryComputerNameW",
"SetLocalTime",
"SetLocaleInfoA",
"SetLocaleInfoW",
"SetMailslotInfo",
"SetMessageWaitingIndicator",
"SetNamedPipeHandleState",
"SetPriorityClass",
"SetProcessAffinityMask",
"SetProcessPriorityBoost",
"SetProcessShutdownParameters",
"SetProcessWorkingSetSize",
"SetStdHandle",
"SetSystemPowerState",
"SetSystemTime",
"SetSystemTimeAdjustment",
"SetTapeParameters",
"SetTapePosition",
"SetTermsrvAppInstallMode",
"SetThreadAffinityMask",
"SetThreadContext",
"SetThreadExecutionState",
"SetThreadIdealProcessor",
"SetThreadLocale",
"SetThreadPriority",
"SetThreadPriorityBoost",
"SetThreadUILanguage",
"SetTimeZoneInformation",
"SetTimerQueueTimer",
"SetUnhandledExceptionFilter",
"SetUserGeoID",
"SetVDMCurrentDirectories",
"SetVolumeLabelA",
"SetVolumeLabelW",
"SetVolumeMountPointA",
"SetVolumeMountPointW",
"SetWaitableTimer",
"SetupComm",
"ShowConsoleCursor",
"SignalObjectAndWait",
"SizeofResource",
"Sleep",
"SleepEx",
"SuspendThread",
"SwitchToFiber",
"SwitchToThread",
"SystemTimeToFileTime",
"SystemTimeToTzSpecificLocalTime",
"TerminateJobObject",
"TerminateProcess",
"TerminateThread",
"TermsrvAppInstallMode",
"Thread32First",
"Thread32Next",
"TlsAlloc",
"TlsFree",
"TlsGetValue",
"TlsSetValue",
"Toolhelp32ReadProcessMemory",
"TransactNamedPipe",
"TransmitCommChar",
"TrimVirtualBuffer",
"TryEnterCriticalSection",
"TzSpecificLocalTimeToSystemTime",
"UTRegister",
"UTUnRegister",
"UnhandledExceptionFilter",
"UnlockFile",
"UnlockFileEx",
"UnmapViewOfFile",
"UnregisterConsoleIME",
"UnregisterWait",
"UnregisterWaitEx",
"UpdateResourceA",
"UpdateResourceW",
"VDMConsoleOperation",
"VDMOperationStarted",
"ValidateLCType",
"ValidateLocale",
"VerLanguageNameA",
"VerLanguageNameW",
"VerSetConditionMask",
"VerifyConsoleIoHandle",
"VerifyVersionInfoA",
"VerifyVersionInfoW",
"VirtualAlloc",
"VirtualAllocEx",
"VirtualBufferExceptionHandler",
"VirtualFree",
"VirtualFreeEx",
"VirtualLock",
"VirtualProtect",
"VirtualProtectEx",
"VirtualQuery",
"VirtualQueryEx",
"VirtualUnlock",
"WTSGetActiveConsoleSessionId",
"WaitCommEvent",
"WaitForDebugEvent",
"WaitForMultipleObjects",
"WaitForMultipleObjectsEx",
"WaitForSingleObject",
"WaitForSingleObjectEx",
"WaitNamedPipeA",
"WaitNamedPipeW",
"WideCharToMultiByte",
"WinExec",
"WriteConsoleA",
"WriteConsoleInputA",
"WriteConsoleInputVDMA",
"WriteConsoleInputVDMW",
"WriteConsoleInputW",
"WriteConsoleOutputA",
"WriteConsoleOutputAttribute",
"WriteConsoleOutputCharacterA",
"WriteConsoleOutputCharacterW",
"WriteConsoleOutputW",
"WriteConsoleW",
"WriteFile",
"WriteFileEx",
"WriteFileGather",
"WritePrivateProfileSectionA",
"WritePrivateProfileSectionW",
"WritePrivateProfileStringA",
"WritePrivateProfileStringW",
"WritePrivateProfileStructA",
"WritePrivateProfileStructW",
"WriteProcessMemory",
"WriteProfileSectionA",
"WriteProfileSectionW",
"WriteProfileStringA",
"WriteProfileStringW",
"WriteTapemark",
"ZombifyActCtx",
"_hread",
"_hwrite",
"_lclose",
"_lcreat",
"_llseek",
"_lopen",
"_lread",
"_lwrite",
"lstrcat",
"lstrcatA",
"lstrcatW",
"lstrcmp",
"lstrcmpA",
"lstrcmpW",
"lstrcmpi",
"lstrcmpiA",
"lstrcmpiW",
"lstrcpy",
"lstrcpyA",
"lstrcpyW",
"lstrcpyn",
"lstrcpynA",
"lstrcpynW",
"lstrlen",
"lstrlenA",
"lstrlenW",
]
STRIP_LINES = [
"Dumper Version",
"Microsoft Corporation",
"Dump of file",
"File Type",
"Section contains the",
"Import Address Table",
"Import Name Table",
"time date stamp",
"Index of first forwarder reference",
"Summary",
".data",
".gfids",
".rdata",
".reloc",
".text",
".tls",
".rsrc",
".00cfg",
".idata",
"KERNEL32.dll",
"dbghelp.dll",
]
CONSOLE_LINES = [
"operating system version",
"subsystem version",
]
CONSOLE_VERSION = [
"5.01",
]
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
"-p",
"--windows_pe_file",
help="pe file check runnable on Windows xp sp2",
dest="pe_file",
type=str,
required=True,
)
args = parser.parse_args()
if not os.path.isfile(args.pe_file):
print("ERROR: can not find file:{}".format(args.pe_file))
exit(-1)
cmd = 'cmd.exe /c "dumpbin /imports {}"'.format(args.pe_file)
raw_log = subprocess.check_output(cmd)
raw_log = raw_log.decode("utf-8").split("\r\n")
import_function = []
for log in raw_log:
is_in_strip = False
if log != "":
for strip_line in STRIP_LINES:
if log.find(strip_line) >= 0:
is_in_strip = True
break
if not is_in_strip:
import_function.append(log.split()[1])
assert len(import_function) > 0, "import function should not be zero"
for i in import_function:
msg = (
"target import function: '{}' can not find in KERNEL32_XP_SP2_EXPORT_SYMBOLS\n"
"please check your MR modify, possible reasons:\n"
"1: use std::thread/std::this_thread in inference code, put this code under #if !__DEPLOY_ON_XP_SP2__\n"
"2: use std::mutex in inference code, replace it to DNN_MUTEX/MGB_MUTEX/LITE_MUTEX\n"
"3: more detail please do git show 65ac48b95e99f2c510fe5db449cc8182d682e113 to refine your MR".format(
i
)
)
assert i in KERNEL32_XP_SP2_EXPORT_SYMBOLS, "{}".format(msg)
print("check import fuction: '{}' success".format(i))
print("check pe file: {} import function success!!!".format(args.pe_file))
cmd = 'cmd.exe /c "dumpbin /HEADERS {}"'.format(args.pe_file)
raw_log = subprocess.check_output(cmd)
raw_log = raw_log.decode("utf-8").split("\r\n")
console_version = []
for log in raw_log:
for console_line in CONSOLE_LINES:
if log.find(console_line) >= 0:
console_version.append(log.split()[0])
assert len(console_version) > 0, "console version should not be zero"
for i in console_version:
msg = (
"check console version: '{}' failed\n"
"please check your MR modify, possible reasons:\n"
"1: need add /SUBSYSTEM:CONSOLE,5.01 for linker when (cmake)define MGE_DEPLOY_INFERENCE_ON_WINDOWS_XP_SP2\n"
' bazel --copt "-D__DEPLOY_ON_XP_SP2__=1"'.format(i)
)
assert i in CONSOLE_VERSION, "{}".format(msg)
print("check console version: '{}' success".format(i))
print("check pe file: {} console version success!!!".format(args.pe_file))
if __name__ == "__main__":
assert platform.system() == "Windows", "can only run at windows env!!!"
main()