windows-nt/Source/XPSP1/NT/sdktools/debuggers/imagehlp/impchk.cxx
2020-09-26 16:20:57 +08:00

796 lines
19 KiB
C++

#include <windows.h>
#include <winnt.h>
#include <imagehlp.h>
#include <stdio.h>
#include <stdlib.h>
LOADED_IMAGE Image;
int __cdecl CompareNames (const void *pv1, const void *pv2)
{
return(strcmp((const char *)pv1, *(const char **)pv2));
}
char *rgszBetaAPIs[] = {
"ABProviderInit",
"AddInksetInterval",
"AddPenDataHRC",
"AddPenInputHRC",
"AddPointsPenData",
"AddPropertySheet",
"AddWordsHWL",
"AnimateProc",
"AssociateProperties",
"AtomicVirtualEvent",
"BeginEnumStrokes",
"BoundingRectFromPoints",
"BroadcastSystemMessage",
"BrowseCallbackProc",
"BuildDisplayTable",
"CallWndRetProc",
"CascadeWindows",
"ChangeIdleRoutine",
"CharacterToSymbol",
"CheckColorsInGamut",
"CheckMenuRadioItem",
"CheckParameters",
"CloseIMsgSession",
"CloseProperties",
"ColorMatchToTarget",
"CommConfigDialog",
"CompactPenData",
"CompressPenData",
"ConfigHREC",
"ConfigRecognizer",
"CopyImage",
"CorrectWriting",
"CorrectWritingEx",
"CreateColorSpace",
"CreateCompatibleHRC",
"CreateHWL",
"CreateIProp",
"CreateIconFromResourceEx",
"CreateInkset",
"CreateInksetHRCRESULT",
"CreatePenData",
"CreatePenDataEx",
"CreatePenDataHRC",
"CreatePenDataRegion",
"CreateTable",
"CreateToolhelp32Snapshot",
"DPtoTP",
"DeleteColorSpace",
"DeregisterIdleRoutine",
"DestroyHRC",
"DestroyHRCRESULT",
"DestroyHWL",
"DestroyInkset",
"DestroyPenData",
"DictionarySearch",
"DisplayGuesses",
"DoDefaultPenInput",
"DrawAnimatedRects",
"DrawArrow",
"DrawCaption",
"DrawMirrorImage",
"DrawPenData",
"DrawPenDataEx",
"DrawPenDataFmt",
"DrawState",
"DrawStateProc",
"DrawTextEx",
"DuplicatePenData",
"EditProperties",
"EmulatePen",
"EnableGestureSetHRC",
"EnableIdleRoutine",
"EnableSystemDictionaryHRC",
"EndEnumStrokes",
"EndPenInputHRC",
"EnumFontFamExProc",
"EnumFontFamiliesEx",
"EnumICMProfiles",
"EnumICMProfilesProc",
"EnumProperties",
"EnumPropertyLibs",
"EnumPropertySheets",
"EnumRegisterWordProc",
"EnumSymbols",
"EnumSymbolsCallback",
"ExtractPenDataPoints",
"ExtractPenDataStrokes",
"FAbsTimeInInterval",
"FBadColumnSet",
"FBadEntryList",
"FBadProp",
"FBadPropTag",
"FBadRestriction",
"FBadRglpNameID",
"FBadRglpszW",
"FBadRow",
"FBadRowSet",
"FBadSortOrderSet",
"FBinFromHex",
"FEQAbsTime",
"FEqualNames",
"FIntervalInInterval",
"FIntervalXInterval",
"FLEAbsTime",
"FLTAbsTime",
"FPropCompareProp",
"FPropContainsProp",
"FPropExists",
"FindWindowEx",
"FirstSymbolFromGraph",
"FlushProperties",
"FreeImageColorMatcher",
"FreePadrlist",
"FreePropertyLib",
"FreePropertySheets",
"FreeProws",
"FtAddFt",
"FtMulDw",
"FtMulDwDw",
"FtNegFt",
"FtSubFt",
"FtgRegisterIdleRoutine",
"GetAlphabetHRC",
"GetAlphabetPriorityHRC",
"GetAlternateWordsHRCRESULT",
"GetAttribIMsgOnIStg",
"GetBoxMappingHRCRESULT",
"GetBoxResultsHRC",
"GetCharacterPlacement",
"GetClassInfoEx",
"GetColorSpace",
"GetCommConfig",
"GetDefaultCommConfig",
"GetDeviceGammaRamp",
"GetFontLanguageInfo",
"GetGlobalRC",
"GetGuideHRC",
"GetHRECFromHRC",
"GetHotspotsHRCRESULT",
"GetICMProfile",
"GetInksetInterval",
"GetInksetIntervalCount",
"GetInstance",
"GetInternationalHRC",
"GetKeyboardLayout",
"GetKeyboardLayoutList",
"GetLogColorSpace",
"GetMaxResultsHRC",
"GetMenuDefaultItem",
"GetMenuItemInfo",
"GetMenuItemRect",
"GetPenAppFlags",
"GetPenAsyncState",
"GetPenDataAttributes",
"GetPenDataInfo",
"GetPenDataStroke",
"GetPenHwEventData",
"GetPenInput",
"GetPenMiscInfo",
"GetPenResource",
"GetPointsFromPenData",
"GetProperties",
"GetResultsHRC",
"GetStrokeAttributes",
"GetStrokeTableAttributes",
"GetSymbolCount",
"GetSymbolCountHRCRESULT",
"GetSymbolMaxLength",
"GetSymbolsHRCRESULT",
"GetSysColorBrush",
"GetSystemPowerStatus",
"GetTextCharsetInfo",
"GetVersionPenWin",
"GetWordlistCoercionHRC",
"GetWordlistHRC",
"HPProviderInit",
"Heap32First",
"Heap32ListFirst",
"Heap32ListNext",
"Heap32Next",
"HexFromBin",
"HitTestPenData",
"HrAddColumnsEx",
"HrAllocAdviseSink",
"HrComposeEID",
"HrComposeMsgID",
"HrDecomposeEID",
"HrDecomposeMsgID",
"HrEntryIDFromSz",
"HrGetOneProp",
"HrIStorageFromStream",
"HrQueryAllRows",
"HrSetOneProp",
"HrSzFromEntryID",
"HrThisThreadAdviseSink",
"HrValidateIPMSubtree",
"ImmAssociateContext",
"ImmConfigureIME",
"ImmCreateContext",
"ImmDestroyContext",
"ImmEnumRegisterWord",
"ImmEscape",
"ImmGetCandidateList",
"ImmGetCandidateListCount",
"ImmGetCandidateWindow",
"ImmGetCompositionFont",
"ImmGetCompositionString",
"ImmGetCompositionWindow",
"ImmGetContext",
"ImmGetConversionList",
"ImmGetConversionStatus",
"ImmGetDefaultIMEWnd",
"ImmGetDescription",
"ImmGetGuideLine",
"ImmGetIMEFileName",
"ImmGetOpenStatus",
"ImmGetProperty",
"ImmGetRegisterWordStyle",
"ImmGetStatusWindowPos",
"ImmGetVirtualKey",
"ImmInstallIME",
"ImmIsIME",
"ImmIsUIMessage",
"ImmNotifyIME",
"ImmRegisterWord",
"ImmReleaseContext",
"ImmSetCandidateWindow",
"ImmSetCompositionFont",
"ImmSetCompositionString",
"ImmSetCompositionWindow",
"ImmSetConversionStatus",
"ImmSetOpenStatus",
"ImmSetStatusWindowPos",
"ImmSimulateHotKey",
"ImmUnregisterWord",
"InfoWndProc",
"InitRC",
"InputWndProc",
"InsertMenuItem",
"InsertPenData",
"InsertPenDataPoints",
"InsertPenDataStroke",
"InstallRecognizer",
"IsPenAware",
"IsPenEvent",
"KKConvert",
"LPropCompareProp",
"LaunchWizard",
"LoadImage",
"LoadImageColorMatcher",
"LoadPropertyLib",
"LoadPropertySheets",
"LookupIconIdFromDirectoryEx",
"MAPIAddress",
"MAPIAdminProfiles",
"MAPIAllocateBuffer",
"MAPIAllocateMore",
"MAPIDeInitIdle",
"MAPIDeleteMail",
"MAPIDetails",
"MAPIFindNext",
"MAPIFreeBuffer",
"MAPIGetDefaultMalloc",
"MAPIInitIdle",
"MAPIInitialize",
"MAPILogoff",
"MAPILogon",
"MAPILogonEx",
"MAPIMessage",
"MAPIOpenFormMgr",
"MAPIOpenLocalFormContainer",
"MAPIReadMail",
"MAPIRecip",
"MAPIResolveName",
"MAPISaveMail",
"MAPISendDocuments",
"MAPISendMail",
"MAPIUnintialize",
"MSProviderInit",
"MakeAbsTime",
"MapStorageSCode",
"MapVirtualKeyEx",
"MapiFile",
"MapiFileDesc",
"MapiFileTagExt",
"MapiMessage",
"MapiRecipDesc",
"MenuItemFromPoint",
"MessageBoxIndirect",
"MetricScalePenData",
"Module32First",
"Module32Next",
"OffsetPenData",
"OpenIMsgOnIStg",
"OpenIMsgOnIStorage",
"OpenIMsgSession",
"OpenProperties",
"OpenStreamOnFile",
"OpenTnefStream",
"OpenTnefStreamEx",
"PPChangePassword",
"PPGetPasswordStatus",
"PaintDesktop",
"PeekPenInput",
"PenDataFromBuffer",
"PenDataToBuffer",
"PostVirtualKeyEvent",
"PostVirtualMouseEvent",
"PpropFindProp",
"PreprocessMessage",
"Process32First",
"Process32Next",
"ProcessHRC",
"ProcessWriting",
"PropCopyMore",
"PwdChangePassword",
"PwdGetPasswordStatus",
"PwdSetPasswordStatus",
"RTFSync",
"RawWndProc",
"ReadHWL",
"Recognize",
"RecognizeData",
"RedisplayPenData",
"RegisterClassEx",
"RegisterPenApp",
"RemovePenDataStrokes",
"RemovePreprocessInfo",
"RemovePropertySheet",
"ResizePenData",
"ResultsHookHREC",
"SAVEOPTS",
"SAndRestriction",
"SAppTimeArray",
"SBinary",
"SBinaryArray",
"SBitMaskRestriction",
"SCommentRestriction",
"SComparePropsRestriction",
"SContentRestriction",
"SCurrencyArray",
"SDateTimeArray",
"SDoubleArray",
"SExistRestriction",
"SGuidArray",
"SHAddToRecentDocs",
"SHAppBarMessage",
"SHBrowseForFolder",
"SHChangeNotify",
"SHFileOperation",
"SHFreeNameMappings",
"SHGetDesktopFolder",
"SHGetFileInfo",
"SHGetInstanceExplorer",
"SHGetMalloc",
"SHGetNameMappingCount",
"SHGetNameMappingPtr",
"SHGetPathFromIDList",
"SHGetSpecialFolderLocation",
"SHLoadInProc",
"SLPSTRArray",
"SLargeIntegerArray",
"SLongArray",
"SMAPIFormInfoArray",
"SMAPIFormProp",
"SMAPIFormPropArray",
"SMAPIFormPropEnumVal",
"SMAPIVerb",
"SMAPIVerbArray",
"SMessageClassArray",
"SNotRestriction",
"SOBailOut",
"SOBeginTable",
"SOEndColumnInfo",
"SOEndFieldInfo",
"SOEndFontTable",
"SOEndPalette",
"SOEndTabStops",
"SOEndTable",
"SOGetInfo",
"SOGetScanLineBuffer",
"SOPutBitmapHeader",
"SOPutBreak",
"SOPutChar",
"SOPutCharAttr",
"SOPutCharFontById",
"SOPutCharFontByName",
"SOPutCharHeight",
"SOPutCharX",
"SOPutColumnInfo",
"SOPutDataCell",
"SOPutEmbeddedObject",
"SOPutField",
"SOPutFieldInfo",
"SOPutFontTableEntry",
"SOPutHdrEntry",
"SOPutMoreText",
"SOPutMoreVarField",
"SOPutPaletteEntry",
"SOPutParaAlign",
"SOPutParaIndents",
"SOPutParaMargins",
"SOPutParaSpacing",
"SOPutScanLineData",
"SOPutSectionName",
"SOPutSectionType",
"SOPutSpecialCharX",
"SOPutSubdocInfo",
"SOPutTabStop",
"SOPutTableCellInfo",
"SOPutTableRowFormat",
"SOPutTextCell",
"SOPutVarField",
"SOPutVectorHeader",
"SOSetDateBase",
"SOStartColumnInfo",
"SOStartFieldInfo",
"SOStartFontTable",
"SOStartPalette",
"SOStartTabStops",
"SOVectorAttr",
"SOVectorObject",
"SOrRestriction",
"SPropAttrArray",
"SPropProblem",
"SPropProblemArray",
"SPropTagArray",
"SPropValue",
"SPropertyRestriction",
"SRealArray",
"SRestriction",
"SRow",
"SRowSet",
"SShortArray",
"SSizeRestriction",
"SSortOrder",
"SSortOrderSet",
"SSubRestriction",
"STnefProblem",
"STnefProblemArray",
"SUUserPopData",
"SUUserPushData",
"SUUserRetrieveData",
"SUUserSaveData",
"SWStringArray",
"ScBinFromHexBounded",
"ScCopyNotifications",
"ScCopyProps",
"ScCountNotifications",
"ScCountProps",
"ScDupPropset",
"ScLocalPathFromUNC",
"ScRelocNotifications",
"ScRelocProps",
"ScUNCFromLocalPath",
"SetAlphabetHRC",
"SetAlphabetPriorityHRC",
"SetAttribIMsgOnIStg",
"SetBoxAlphabetHRC",
"SetColorSpace",
"SetCommConfig",
"SetDefaultCommConfig",
"SetDeviceGammaRamp",
"SetGlobalRC",
"SetGuideHRC",
"SetICMMode",
"SetICMProfile",
"SetInternationalHRC",
"SetMaxResultsHRC",
"SetMenuDefaultItem",
"SetMenuItemInfo",
"SetMessageExtraInfo",
"SetPenAppFlags",
"SetPenHook",
"SetPenHookCallback",
"SetPenMiscInfo",
"SetProperties",
"SetRecogHook",
"SetResultsHookHREC",
"SetStrokeAttributes",
"SetStrokeTableAttributes",
"SetSystemPowerState",
"SetWordlistCoercionHRC",
"SetWordlistHRC",
"Shell_NotifyIcon",
"ShowKeyboard",
"ShowWindowAsync",
"StartInking",
"StartPenInput",
"StopInking",
"StopPenInput",
"SymbolToCharacter",
"TPtoDP",
"TargetPoints",
"Thread32First",
"Thread32Next",
"TileWindows",
"ToAsciiEx",
"Toolhelp32ReadProcessMemory",
"TrackPopupMenuEx",
"TrainContext",
"TrainHREC",
"TrainInk",
"TranslateCharsetInfo",
"TrimPenData",
"UnhookResultsHookHREC",
"UninstallRecognizer",
"UpdatePenInfo",
"ValidateParameters",
"VkKeyScanEx",
"VwStreamCloseFunc",
"VwStreamOpenFunc",
"VwStreamReadFunc",
"VwStreamReadRecordFunc",
"VwStreamSectionFunc",
"VwStreamSeekFunc",
"VwStreamTellFunc",
"WrapCompressedRTFStream",
"WrapStoreEntryID",
"WriteHWL",
"XPProviderInit",
"attAttachRenddata",
"attConversationID",
"attFrom",
"attMAPIProps",
"attMessageStatus",
"attOriginalMessageClass",
"attOwner",
"attParentID",
"attPriority",
"attRecipTable",
"attSentFor",
"dwDiffAT",
"dwDurInterval",
"lineAccept",
"lineAddProvider",
"lineAddToConference",
"lineAnswer",
"lineBlindTransfer",
"lineCallbackFunc",
"lineClose",
"lineCompleteCall",
"lineCompleteTransfer",
"lineConfigDialog",
"lineConfigDialogEdit",
"lineConfigProvider",
"lineDeallocateCall",
"lineDevSpecific",
"lineDevSpecificFeature",
"lineDial",
"lineDrop",
"lineForward",
"lineGatherDigits",
"lineGenerateDigits",
"lineGenerateTone",
"lineGetAddressCaps",
"lineGetAddressID",
"lineGetAddressStatus",
"lineGetAppPriority",
"lineGetCallInfo",
"lineGetCallStatus",
"lineGetConfRelatedCalls",
"lineGetCountry",
"lineGetDevCaps",
"lineGetDevConfig",
"lineGetID",
"lineGetIcon",
"lineGetLineDevStatus",
"lineGetNewCalls",
"lineGetNumRings",
"lineGetProviderList",
"lineGetRequest",
"lineGetStatusMessages",
"lineGetTranslateCaps",
"lineHandoff",
"lineHold",
"lineInitialize",
"lineMakeCall",
"lineMonitorDigits",
"lineMonitorMedia",
"lineMonitorTones",
"lineNegotiateAPIVersion",
"lineNegotiateExtVersion",
"lineOpen",
"linePark",
"linePickup",
"linePrepareAddToConference",
"lineRedirect",
"lineRegisterRequestRecipient",
"lineReleaseUserUserInfo",
"lineRemoveFromConference",
"lineRemoveProvider",
"lineSecureCall",
"lineSendUserUserInfo",
"lineSetAppPriority",
"lineSetAppSpecific",
"lineSetCallParams",
"lineSetCallPrivilege",
"lineSetCurrentLocation",
"lineSetDevConfig",
"lineSetMediaControl",
"lineSetMediaMode",
"lineSetNumRings",
"lineSetStatusMessages",
"lineSetTerminal",
"lineSetTollList",
"lineSetupConference",
"lineSetupTransfer",
"lineShutdown",
"lineSwapHold",
"lineTranslateAddress",
"lineTranslateDialog",
"lineUncompleteCall",
"lineUnhold",
"lineUnpark",
"phoneCallbackFunc",
"phoneClose",
"phoneConfigDialog",
"phoneDevSpecific",
"phoneGetButtonInfo",
"phoneGetData",
"phoneGetDevCaps",
"phoneGetDisplay",
"phoneGetGain",
"phoneGetHookSwitch",
"phoneGetID",
"phoneGetIcon",
"phoneGetLamp",
"phoneGetRing",
"phoneGetStatus",
"phoneGetStatusMessages",
"phoneGetVolume",
"phoneInitialize",
"phoneNegotiateAPIVersion",
"phoneNegotiateExtVersion",
"phoneOpen",
"phoneSetButtonInfo",
"phoneSetData",
"phoneSetDisplay",
"phoneSetGain",
"phoneSetHookSwitch",
"phoneSetLamp",
"phoneSetRing",
"phoneSetStatusMessages",
"phoneSetVolume",
"phoneShutdown",
"tapiGetLocationInfo",
"tapiRequestDrop",
"tapiRequestMakeCall",
"tapiRequestMediaCall",
"ulValidateParameters"
};
BOOL
VerifyImageImports(
char *ImageName
);
void __cdecl
main(
int argc,
char *argv[]
)
{
int i;
if (argc < 2 ||
(((argv[1][0] == '/') || (argv[1][0] == '-')) &&
(argv[1][1] == '?'))) {
puts("Usage: impchk <imagename>\n"
" where <imagename> is the image you want to check for beta API's");
} else {
i = 0;
while (argc > 1) {
argc--;
i++;
printf("Image: \"%s\" should %s marked as Beta\n",
argv[i],
VerifyImageImports(argv[i]) ? "be" : "not be");
}
}
}
BOOL
VerifyImageImports(
char *ImageName
)
{
PIMAGE_IMPORT_DESCRIPTOR Imports;
PIMAGE_THUNK_DATA tname;
PIMAGE_THUNK_DATA ThunkNames;
PIMAGE_IMPORT_BY_NAME ImportName;
ULONG NumberOfThunks;
ULONG i, cb;
UCHAR NameBuffer[ 32 ];
PIMAGE_NT_HEADERS NtHeaders;
ULONG ImportSize;
LPSTR ImportModule;
BOOL rc = FALSE;
if (MapAndLoad(ImageName, ".", &Image, TRUE, TRUE)) {
Image.ModuleName = ImageName;
//
// Now locate and walk through and process the images imports
//
NtHeaders = ImageNtHeader( (PVOID)Image.MappedAddress );
if (NtHeaders != NULL) {
Imports = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(
(PVOID)Image.MappedAddress,
FALSE,
IMAGE_DIRECTORY_ENTRY_IMPORT,
&ImportSize
);
for(;Imports;Imports++) {
if (!Imports->Name) {
break;
}
ImportModule = (LPSTR) ImageRvaToVa( (PIMAGE_NT_HEADERS) Image.FileHeader,
Image.MappedAddress,
(ULONG) Imports->Name,
&Image.LastRvaSection);
if (ImportModule) {
ThunkNames = (PIMAGE_THUNK_DATA) ImageRvaToVa(
(PIMAGE_NT_HEADERS)Image.FileHeader,
Image.MappedAddress,
(ULONG) Imports->OriginalFirstThunk,
&Image.LastRvaSection);
if (!ThunkNames || ThunkNames->u1.Function == 0) {
//
// Skip this one if no thunks or first thunk is the terminating null thunk
//
continue;
}
//
NumberOfThunks = 0;
tname = ThunkNames;
while (tname->u1.AddressOfData) {
NumberOfThunks++;
tname++;
}
tname = ThunkNames;
for(i=0;i<NumberOfThunks;i++) {
if (!(BOOL)IMAGE_SNAP_BY_ORDINAL(tname->u1.Ordinal)) {
ImportName = (PIMAGE_IMPORT_BY_NAME)
ImageRvaToVa((PIMAGE_NT_HEADERS)Image.FileHeader,
Image.MappedAddress,
(ULONG)(ULONG_PTR) tname->u1.AddressOfData,
&Image.LastRvaSection);
if (bsearch(ImportName->Name,
rgszBetaAPIs,
sizeof(rgszBetaAPIs) / sizeof(char *),
sizeof(char *),
CompareNames
)) {
printf("%s: Imports \"%s\" from \"%s\"\n",
ImageName,
ImportName->Name,
ImportModule);
rc = TRUE;
}
}
tname++;
}
}
}
}
UnMapAndLoad(&Image);
}
return(rc);
}