Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

148 lines
4.8 KiB

#include <private.h>
#include <VerifyFinalImage.h>
#include <process.h>
BOOL VerifyLc(PCHAR FileName,
UCHAR* LcFullFileName, // added to move to seperate file
PVLCA pVerifyFunction, // added to move to seperate file
BOOL fRetail) {
HRESULT hr = (*pVerifyFunction)(FileName, LcFullFileName);
if (FAILED(hr)) {
if (hr == HRESULT_FROM_WIN32(ERROR_NO_MATCH)) {
fprintf(stderr,
"BINPLACE : %s BNP0000: resource conflicts with localization constraint \"%s\"\n",
fRetail ? "error" : "warning",
FileName);
}
else {
fprintf(stderr,
"BINPLACE : %s BNP0000: VerifyLc %s failed 0x%lX\n",
fRetail ? "error" : "warning", FileName, hr);
}
return FALSE;
}
return TRUE;
}
typedef DWORD (WINAPI *PFNGVS)(LPSTR, LPDWORD);
BOOL VerifyFinalImage(IN PCHAR FileName,
IN BOOL fRetail,
IN BOOL fVerifyLc, // added to move to seperate file
IN UCHAR* LcFileName, // added to move to seperate file
IN PVLCA pVLCAFunction, // added to move to seperate file
OUT PBOOL BinplaceLc) {
HINSTANCE hVersion;
PFNGVS pfnGetFileVersionInfoSize;
DWORD dwSize;
DWORD dwReturn;
BOOL fRC = TRUE,
rc = TRUE,
tlb = FALSE;
LOADED_IMAGE LoadedImage;
OSVERSIONINFO VersionInfo;
LoadedImage.hFile = INVALID_HANDLE_VALUE;
*BinplaceLc = FALSE;
if (fVerifyLc) {
if (!VerifyLc(FileName, LcFileName, pVLCAFunction, fRetail)) {
fRC = fRetail ? FALSE : TRUE;
goto End1;
}
*BinplaceLc = TRUE;
}
VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx ( &VersionInfo );
if ( VersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT )
return( TRUE ); // Not NT - can't load Win64 binaries
if ( VersionInfo.dwMajorVersion < 5 )
return ( TRUE ); // Prior to Win2K - can't load Win64 binaries
rc = MapAndLoad(FileName, NULL, &LoadedImage, FALSE, TRUE);
if (!rc) {
// Not a binary. See if it's one of the other types we care about (like typelibs)
CHAR szExt[_MAX_EXT];
_splitpath(FileName, NULL, NULL, NULL, szExt);
// The only non-binary images that need version resources are .tlb's
if (_stricmp(szExt, ".tlb")) {
return(TRUE);
}
tlb=TRUE;
}
hVersion = LoadLibraryA("VERSION.DLL");
if (hVersion == NULL) {
goto End1;
}
pfnGetFileVersionInfoSize = (PFNGVS) GetProcAddress(hVersion, "GetFileVersionInfoSizeA");
if (pfnGetFileVersionInfoSize == NULL) {
goto End2;
}
if ((dwReturn = pfnGetFileVersionInfoSize(FileName, &dwSize)) == 0) {
if ( !tlb && (LoadedImage.FileHeader->FileHeader.Machine != IMAGE_FILE_MACHINE_I386) &&
(LoadedImage.FileHeader->FileHeader.Machine != IMAGE_FILE_MACHINE_AMD64) &&
(LoadedImage.FileHeader->FileHeader.Machine != IMAGE_FILE_MACHINE_IA64) ) {
goto End2;
}
if (fRetail) {
fprintf(stderr,
"BINPLACE : %s BNP0000: no version resource detected for \"%s\"\n",
"error",
FileName);
fRC = FALSE;
} else {
fRC = TRUE;
}
}
End2:
FreeLibrary(hVersion);
End1:
if (ImageCheck.Argv != NULL &&
(LoadedImage.hFile != INVALID_HANDLE_VALUE ||
MapAndLoad(FileName, NULL, &LoadedImage, FALSE, TRUE) == TRUE)) {
if ((LoadedImage.FileHeader->FileHeader.Machine == ImageCheck.Machine)) {
int RC;
ImageCheck.Argv[ImageCheck.Argc-2] = FileName;
RC = (int)_spawnvp(P_WAIT, ImageCheck.Argv[0], (const char * const *) ImageCheck.Argv);
if (RC == -1 || RC == 128) {
fprintf(stderr,
"BINPLACE : error BNP0000: Cannot execute (%s). Make sure it (or it's DLL's) exists or verify binplace /CI option.\n", ImageCheck.Argv[0]);
fRC = FALSE;
} else if (RC == 1) {
fprintf(stderr,
"BINPLACE : error BNP0000: ImageCheck (%s) failed.\n", ImageCheck.Argv[0]);
fRC = FALSE;
} else if (RC == ImageCheck.RC) {
fprintf(stderr,
"BINPLACE : error BNP0000: Image checker (%s) detected errors in %s.\n", ImageCheck.Argv[0], FileName);
fRC = FALSE;
}
}
}
if (LoadedImage.hFile != INVALID_HANDLE_VALUE)
UnMapAndLoad(&LoadedImage);
return fRC;
}