badapps.c
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 19k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. /*++
  2. Copyright (c) 1997 Microsoft Corporation
  3. Module Name:
  4.     badapps.c
  5. Abstract:
  6.     Implements a library for CheckBadApps key.
  7. Author:
  8.     Calin Negreanu (calinn)  20-Jan-1999
  9. Revision History:
  10.     <alias> <date> <comments>
  11. --*/
  12. #include <windows.h>
  13. #include <winnt.h>
  14. #include <shlwapi.h>
  15. #include <badapps.h>
  16. #include "utils.h"
  17. #include "version.h"
  18. #include "modules.h"
  19. typedef struct {
  20.     PCTSTR FileName;
  21.     BOOL FindDataLoaded;
  22.     WIN32_FIND_DATA FindData;
  23.     PBYTE MappedImage;
  24.     HANDLE FileHandle;
  25.     HANDLE MapHandle;
  26.     VERSION_STRUCT VersionData;
  27.     HKEY PrevOsKey;
  28. } FILE_DATA, *PFILE_DATA;
  29. typedef BOOL (VERSION_CHECK_PROTOTYPE) (PFILE_DATA FileData, DWORD DataSize, PBYTE Data);
  30. typedef VERSION_CHECK_PROTOTYPE * PVERSION_CHECK_PROTOTYPE;
  31. typedef struct {
  32.     DWORD   VersionId;
  33.     PVERSION_CHECK_PROTOTYPE VersionCheck;
  34. } VERSION_DATA, *PVERSION_DATA;
  35. #define LIBARGS(id, fn) VERSION_CHECK_PROTOTYPE fn;
  36. #define TOOLARGS(name, dispName, allowance, edit, query, output)
  37. VERSION_STAMPS
  38. #undef TOOLARGS
  39. #undef LIBARGS
  40. #define LIBARGS(id, fn) {id, fn},
  41. #define TOOLARGS(name, dispName, allowance, edit, query, output)
  42. VERSION_DATA g_VersionData [] = {
  43.                   VERSION_STAMPS
  44.                   {0, NULL}
  45.                   };
  46. #undef TOOLARGS
  47. #undef LIBARGS
  48. #define FD_FINDDATA     0x00000001
  49. #define FD_MAPPINGDATA  0x00000002
  50. #define FD_VERSIONDATA  0x00000003
  51. #define FD_PREVOSDATA   0x00000004
  52. BOOL
  53. ShLoadFileData (
  54.     IN OUT  PFILE_DATA FileData,
  55.     IN      DWORD FileDataType
  56.     )
  57. {
  58.     LONG status;
  59.     HANDLE findHandle;
  60.     UINT oldMode;
  61.     switch (FileDataType) {
  62.     case FD_FINDDATA:
  63.         if (!FileData->FindDataLoaded) {
  64.             oldMode = SetErrorMode (SEM_FAILCRITICALERRORS);
  65.             findHandle = FindFirstFile (FileData->FileName, &FileData->FindData);
  66.             SetErrorMode(oldMode);
  67.             if (findHandle == INVALID_HANDLE_VALUE) {
  68.                 return FALSE;
  69.             } else {
  70.                 FindClose (findHandle);
  71.                 FileData->FindDataLoaded = TRUE;
  72.             }
  73.         }
  74.         break;
  75.     case FD_MAPPINGDATA:
  76.         if (!FileData->MappedImage) {
  77.             FileData->MappedImage = ShMapFileIntoMemory (
  78.                                         FileData->FileName,
  79.                                         &FileData->FileHandle,
  80.                                         &FileData->MapHandle
  81.                                         );
  82.             if (!FileData->MappedImage) {
  83.                 return FALSE;
  84.             }
  85.         }
  86.         break;
  87.     case FD_VERSIONDATA:
  88.         if (!FileData->VersionData.VersionBuffer) {
  89.             if (!ShCreateVersionStruct (&FileData->VersionData, FileData->FileName)) {
  90.                 FileData->VersionData.VersionBuffer = NULL;
  91.                 return FALSE;
  92.             }
  93.         }
  94.         break;
  95.     case FD_PREVOSDATA:
  96.         if (!FileData->PrevOsKey) {
  97.             status = RegOpenKey (
  98.                         HKEY_LOCAL_MACHINE,
  99.                         S_KEY_PREVOSVERSION,
  100.                         &FileData->PrevOsKey
  101.                         );
  102.             if (status != ERROR_SUCCESS) {
  103.                 return FALSE;
  104.             }
  105.         }
  106.     default:
  107.         return FALSE;
  108.     }
  109.     return TRUE;
  110. }
  111. BOOL
  112. ShFreeFileData (
  113.     IN OUT  PFILE_DATA FileData
  114.     )
  115. {
  116.     FileData->FindDataLoaded = FALSE;
  117.     if (FileData->MappedImage) {
  118.         ShUnmapFile (
  119.             FileData->MappedImage,
  120.             FileData->FileHandle,
  121.             FileData->MapHandle
  122.             );
  123.         FileData->MappedImage = NULL;
  124.         FileData->FileHandle = NULL;
  125.         FileData->MapHandle = NULL;
  126.     }
  127.     if (FileData->VersionData.VersionBuffer) {
  128.         ShDestroyVersionStruct (&FileData->VersionData);
  129.         FileData->VersionData.VersionBuffer = NULL;
  130.     }
  131.     if (FileData->PrevOsKey) {
  132.         RegCloseKey (FileData->PrevOsKey);
  133.         FileData->PrevOsKey = NULL;
  134.     }
  135.     return TRUE;
  136. }
  137. BOOL
  138. ShCheckFileSize (
  139.     IN      PFILE_DATA FileData,
  140.     IN      DWORD DataSize,
  141.     IN      PBYTE Data
  142.     )
  143. {
  144.     if (!ShLoadFileData (FileData, FD_FINDDATA)) {
  145.         return FALSE;
  146.     }
  147.     return (*((PDWORD) Data) == FileData->FindData.nFileSizeLow);
  148. }
  149. BOOL
  150. ShCheckModuleType (
  151.     IN      PFILE_DATA FileData,
  152.     IN      DWORD DataSize,
  153.     IN      PBYTE Data
  154.     )
  155. {
  156.     if (!ShLoadFileData (FileData, FD_MAPPINGDATA)) {
  157.         return FALSE;
  158.     }
  159.     return (*((PDWORD) Data) == ShGetModuleType (FileData->MappedImage));
  160. }
  161. BOOL
  162. ShCheckBinFileVer (
  163.     IN      PFILE_DATA FileData,
  164.     IN      DWORD DataSize,
  165.     IN      PBYTE Data
  166.     )
  167. {
  168.     PULONGLONG value;
  169.     PULONGLONG mask;
  170.     ULONGLONG currVer;
  171.     if (!ShLoadFileData (FileData, FD_VERSIONDATA)) {
  172.         currVer = 0;
  173.     } else {
  174.         currVer = ShVerGetFileVer (&FileData->VersionData);
  175.     }
  176.     value = (PULONGLONG) Data;
  177.     mask = (PULONGLONG) (Data + sizeof (ULONGLONG));
  178.     return (((*value) & (*mask)) == currVer);
  179. }
  180. BOOL
  181. ShCheckBinProductVer (
  182.     IN      PFILE_DATA FileData,
  183.     IN      DWORD DataSize,
  184.     IN      PBYTE Data
  185.     )
  186. {
  187.     PULONGLONG value;
  188.     PULONGLONG mask;
  189.     ULONGLONG currVer;
  190.     if (!ShLoadFileData (FileData, FD_VERSIONDATA)) {
  191.         currVer = 0;
  192.     } else {
  193.         currVer = ShVerGetProductVer (&FileData->VersionData);
  194.     }
  195.     value = (PULONGLONG) Data;
  196.     mask = (PULONGLONG) (Data + sizeof (ULONGLONG));
  197.     return (((*value) & (*mask)) == currVer);
  198. }
  199. BOOL
  200. ShCheckUpToBinProductVer (
  201.     IN      PFILE_DATA FileData,
  202.     IN      DWORD DataSize,
  203.     IN      PBYTE Data
  204.     )
  205. {
  206.     PDWORD ProdVerMS;
  207.     PDWORD ProdVerLS;
  208.     ULONGLONG ProdVerData;
  209.     PDWORD BadProdVerMS;
  210.     PDWORD BadProdVerLS;
  211.     if (!ShLoadFileData (FileData, FD_VERSIONDATA)) {
  212.         ProdVerData = 0;
  213.     } else {
  214.         ProdVerData = ShVerGetProductVer (&FileData->VersionData);
  215.     }
  216.     BadProdVerMS = BadProdVerLS = (PDWORD) Data;
  217.     BadProdVerMS ++;
  218.     ProdVerMS = ProdVerLS = (PDWORD) (&ProdVerData);
  219.     ProdVerMS ++;
  220.     return (*ProdVerMS < *BadProdVerMS) || ((*ProdVerMS == *BadProdVerMS) && (*ProdVerLS <= *BadProdVerLS));
  221. }
  222. BOOL
  223. ShCheckFileDateHi (
  224.     IN      PFILE_DATA FileData,
  225.     IN      DWORD DataSize,
  226.     IN      PBYTE Data
  227.     )
  228. {
  229.     PULONGLONG value;
  230.     ULONGLONG currVer;
  231.     if (!ShLoadFileData (FileData, FD_VERSIONDATA)) {
  232.         currVer = 0;
  233.     } else {
  234.         currVer = ShVerGetFileDateHi (&FileData->VersionData);
  235.     }
  236.     value = (PULONGLONG) Data;
  237.     return (*value == currVer);
  238. }
  239. BOOL
  240. ShCheckFileDateLo (
  241.     IN      PFILE_DATA FileData,
  242.     IN      DWORD DataSize,
  243.     IN      PBYTE Data
  244.     )
  245. {
  246.     PULONGLONG value;
  247.     ULONGLONG currVer;
  248.     if (!ShLoadFileData (FileData, FD_VERSIONDATA)) {
  249.         currVer = 0;
  250.     } else {
  251.         currVer = ShVerGetFileDateLo (&FileData->VersionData);
  252.     }
  253.     value = (PULONGLONG) Data;
  254.     return (*value == currVer);
  255. }
  256. BOOL
  257. ShCheckFileVerOs (
  258.     IN      PFILE_DATA FileData,
  259.     IN      DWORD DataSize,
  260.     IN      PBYTE Data
  261.     )
  262. {
  263.     PULONG value;
  264.     ULONG currVer;
  265.     if (!ShLoadFileData (FileData, FD_VERSIONDATA)) {
  266.         currVer = 0;
  267.     } else {
  268.         currVer = ShVerGetFileVerOs (&FileData->VersionData);
  269.     }
  270.     value = (PULONG) Data;
  271.     return (*value == currVer);
  272. }
  273. BOOL
  274. ShCheckFileVerType (
  275.     IN      PFILE_DATA FileData,
  276.     IN      DWORD DataSize,
  277.     IN      PBYTE Data
  278.     )
  279. {
  280.     PULONG value;
  281.     ULONG currVer;
  282.     if (!ShLoadFileData (FileData, FD_VERSIONDATA)) {
  283.         currVer = 0;
  284.     } else {
  285.         currVer = ShVerGetFileVerType (&FileData->VersionData);
  286.     }
  287.     value = (PULONG) Data;
  288.     return (*value == currVer);
  289. }
  290. BOOL
  291. ShCheckFileCheckSum (
  292.     IN      PFILE_DATA FileData,
  293.     IN      DWORD DataSize,
  294.     IN      PBYTE Data
  295.     )
  296. {
  297.     PULONG value;
  298.     if (!ShLoadFileData (FileData, FD_FINDDATA)) {
  299.         return FALSE;
  300.     }
  301.     if (!ShLoadFileData (FileData, FD_MAPPINGDATA)) {
  302.         return FALSE;
  303.     }
  304.     value = (PULONG) Data;
  305.     return (*value == ShGetCheckSum (FileData->FindData.nFileSizeLow, FileData->MappedImage));
  306. }
  307. BOOL
  308. ShCheckFilePECheckSum (
  309.     IN      PFILE_DATA FileData,
  310.     IN      DWORD DataSize,
  311.     IN      PBYTE Data
  312.     )
  313. {
  314.     PULONG value;
  315.     if (!ShLoadFileData (FileData, FD_MAPPINGDATA)) {
  316.         return FALSE;
  317.     }
  318.     value = (PULONG) Data;
  319.     return (*value == ShGetPECheckSum (FileData->MappedImage));
  320. }
  321. BOOL
  322. ShCheckStrVersion (
  323.     IN      PFILE_DATA FileData,
  324.     IN      PCTSTR ValueToCheck,
  325.     IN      DWORD DataSize,
  326.     IN      PBYTE Data
  327.     )
  328. {
  329.     BOOL result = FALSE;
  330.     PTSTR localData = NULL;
  331. #ifndef UNICODE
  332.     PSTR convStr = NULL;
  333.     INT converted;
  334. #endif
  335.     if (!ShLoadFileData (FileData, FD_VERSIONDATA)) {
  336.         return FALSE;
  337.     }
  338. #ifdef UNICODE
  339.     localData = (PTSTR)Data;
  340. #else
  341.     convStr = HeapAlloc (GetProcessHeap (), 0, DataSize);
  342.     converted = WideCharToMultiByte (
  343.                     CP_ACP,
  344.                     0,
  345.                     (PWSTR)Data,
  346.                     -1,
  347.                     convStr,
  348.                     DataSize,
  349.                     NULL,
  350.                     NULL
  351.                     );
  352.     if (!converted) {
  353.         HeapFree (GetProcessHeap (), 0, convStr);
  354.         return FALSE;
  355.     }
  356.     localData = convStr;
  357. #endif
  358.     result = ShGlobalVersionCheck (&FileData->VersionData, ValueToCheck, localData);
  359. #ifndef UNICODE
  360.     HeapFree (GetProcessHeap (), 0, convStr);
  361. #endif
  362.     return result;
  363. }
  364. BOOL
  365. ShCheckCompanyName (
  366.     IN      PFILE_DATA FileData,
  367.     IN      DWORD DataSize,
  368.     IN      PBYTE Data
  369.     )
  370. {
  371.     return (ShCheckStrVersion (FileData, S_VER_COMPANYNAME, DataSize, Data));
  372. }
  373. BOOL
  374. ShCheckProductVersion (
  375.     IN      PFILE_DATA FileData,
  376.     IN      DWORD DataSize,
  377.     IN      PBYTE Data
  378.     )
  379. {
  380.     return (ShCheckStrVersion (FileData, S_VER_PRODUCTVERSION, DataSize, Data));
  381. }
  382. BOOL
  383. ShCheckProductName (
  384.     IN      PFILE_DATA FileData,
  385.     IN      DWORD DataSize,
  386.     IN      PBYTE Data
  387.     )
  388. {
  389.     return (ShCheckStrVersion (FileData, S_VER_PRODUCTNAME, DataSize, Data));
  390. }
  391. BOOL
  392. ShCheckFileDescription (
  393.     IN      PFILE_DATA FileData,
  394.     IN      DWORD DataSize,
  395.     IN      PBYTE Data
  396.     )
  397. {
  398.     return (ShCheckStrVersion (FileData, S_VER_FILEDESCRIPTION, DataSize, Data));
  399. }
  400. BOOL
  401. ShCheckFileVersion (
  402.     IN      PFILE_DATA FileData,
  403.     IN      DWORD DataSize,
  404.     IN      PBYTE Data
  405.     )
  406. {
  407.     return (ShCheckStrVersion (FileData, S_VER_FILEVERSION, DataSize, Data));
  408. }
  409. BOOL
  410. ShCheckOriginalFileName (
  411.     IN      PFILE_DATA FileData,
  412.     IN      DWORD DataSize,
  413.     IN      PBYTE Data
  414.     )
  415. {
  416.     return (ShCheckStrVersion (FileData, S_VER_ORIGINALFILENAME, DataSize, Data));
  417. }
  418. BOOL
  419. ShCheckInternalName (
  420.     IN      PFILE_DATA FileData,
  421.     IN      DWORD DataSize,
  422.     IN      PBYTE Data
  423.     )
  424. {
  425.     return (ShCheckStrVersion (FileData, S_VER_INTERNALNAME, DataSize, Data));
  426. }
  427. BOOL
  428. ShCheckLegalCopyright (
  429.     IN      PFILE_DATA FileData,
  430.     IN      DWORD DataSize,
  431.     IN      PBYTE Data
  432.     )
  433. {
  434.     return (ShCheckStrVersion (FileData, S_VER_LEGALCOPYRIGHT, DataSize, Data));
  435. }
  436. BOOL
  437. ShCheck16BitDescription (
  438.     IN      PFILE_DATA FileData,
  439.     IN      DWORD DataSize,
  440.     IN      PBYTE Data
  441.     )
  442. {
  443.     PTSTR value;
  444.     BOOL result;
  445.     PTSTR localData = NULL;
  446. #ifndef UNICODE
  447.     PSTR convStr = NULL;
  448.     INT converted;
  449. #endif
  450.     value = ShGet16ModuleDescription (FileData->MappedImage);
  451.     if (!value) {
  452.         return FALSE;
  453.     }
  454. #ifdef UNICODE
  455.     localData = (PTSTR)Data;
  456. #else
  457.     convStr = HeapAlloc (GetProcessHeap (), 0, DataSize);
  458.     converted = WideCharToMultiByte (
  459.                     CP_ACP,
  460.                     0,
  461.                     (PWSTR)Data,
  462.                     -1,
  463.                     convStr,
  464.                     DataSize,
  465.                     NULL,
  466.                     NULL
  467.                     );
  468.     if (!converted) {
  469.         HeapFree (GetProcessHeap (), 0, convStr);
  470.         return FALSE;
  471.     }
  472.     localData = convStr;
  473. #endif
  474.     result = ShIsPatternMatch (localData, value);
  475. #ifndef UNICODE
  476.     HeapFree (GetProcessHeap (), 0, convStr);
  477. #endif
  478.     HeapFree (GetProcessHeap (), 0, value);
  479.     return result;
  480. }
  481. BOOL
  482. pShLoadPrevOsData (
  483.     IN      PFILE_DATA FileData,
  484.     IN      PCTSTR ValueName,
  485.     OUT     PDWORD Value
  486.     )
  487. {
  488.     LONG status;
  489.     BOOL result = FALSE;
  490.     DWORD type;
  491.     DWORD valueSize = sizeof (DWORD);
  492.     if (ShLoadFileData (FileData, FD_PREVOSDATA)) {
  493.         status = RegQueryValueEx (FileData->PrevOsKey, ValueName, NULL, &type, (PBYTE)Value, &valueSize);
  494.         if ((status == ERROR_SUCCESS) &&
  495.             (type == REG_DWORD)
  496.             ) {
  497.             result = TRUE;
  498.         }
  499.     }
  500.     return result;
  501. }
  502. BOOL
  503. ShCheckPrevOsMajorVersion (
  504.     IN      PFILE_DATA FileData,
  505.     IN      DWORD DataSize,
  506.     IN      PBYTE Data
  507.     )
  508. {
  509.     BOOL result = FALSE;
  510.     DWORD value = 0;
  511.     if (pShLoadPrevOsData (FileData, S_VAL_MAJORVERSION, &value)) {
  512.         result = (value == *(PDWORD)(Data));
  513.     }
  514.     return result;
  515. }
  516. BOOL
  517. ShCheckPrevOsMinorVersion (
  518.     IN      PFILE_DATA FileData,
  519.     IN      DWORD DataSize,
  520.     IN      PBYTE Data
  521.     )
  522. {
  523.     BOOL result = FALSE;
  524.     DWORD value = 0;
  525.     if (pShLoadPrevOsData (FileData, S_VAL_MINORVERSION, &value)) {
  526.         result = (value == *(PDWORD)(Data));
  527.     }
  528.     return result;
  529. }
  530. BOOL
  531. ShCheckPrevOsPlatformId (
  532.     IN      PFILE_DATA FileData,
  533.     IN      DWORD DataSize,
  534.     IN      PBYTE Data
  535.     )
  536. {
  537.     BOOL result = FALSE;
  538.     DWORD value = 0;
  539.     if (pShLoadPrevOsData (FileData, S_VAL_PLATFORMID, &value)) {
  540.         result = (value == *(PDWORD)(Data));
  541.     }
  542.     return result;
  543. }
  544. BOOL
  545. ShCheckPrevOsBuildNo (
  546.     IN      PFILE_DATA FileData,
  547.     IN      DWORD DataSize,
  548.     IN      PBYTE Data
  549.     )
  550. {
  551.     BOOL result = FALSE;
  552.     DWORD value = 0;
  553.     if (pShLoadPrevOsData (FileData, S_VAL_BUILDNO, &value)) {
  554.         result = (value == *(PDWORD)(Data));
  555.     }
  556.     return result;
  557. }
  558. BOOL
  559. DoesPathExist (
  560.     IN      PCTSTR Path
  561.     )
  562. {
  563.     BOOL result = FALSE;
  564.     DWORD errMode;
  565.     if (Path)
  566.     {
  567.         errMode = SetErrorMode (SEM_FAILCRITICALERRORS);
  568.         result = (GetFileAttributes (Path) != 0xFFFFFFFF);
  569.         SetErrorMode(errMode);
  570.     }
  571.     return result;
  572. }
  573. BOOL
  574. pShCheckBlob (
  575.     IN      PCTSTR FileName,
  576.     IN      PBYTE Blob,
  577.     IN      BOOL QuickMode
  578.     )
  579. {
  580.     FILE_DATA fileData;
  581.     PVERSION_DATA p;
  582.     DWORD dataId;
  583.     DWORD dataSize;
  584.     BOOL result = TRUE;
  585.     PTSTR reqFile = NULL;
  586. PTSTR oldReqFile = NULL;
  587.     PCTSTR filePtr = NULL;
  588.     UINT prefixPathChars;
  589.     PTSTR localData = NULL;
  590. #ifndef UNICODE
  591.     PSTR convStr = NULL;
  592.     INT converted;
  593. #endif
  594.     ZeroMemory (&fileData, sizeof (FILE_DATA));
  595.     fileData.FileName = FileName;
  596.     if (!DoesPathExist (fileData.FileName)) {
  597.         return FALSE;
  598.     }
  599.     filePtr = ShGetFileNameFromPath (FileName);
  600.     if (!filePtr) {
  601.         return FALSE;
  602.     }
  603.     prefixPathChars = (UINT)(filePtr - FileName);
  604.     __try {
  605.         dataId = *((PDWORD) Blob);
  606.         while (dataId) {
  607.             if (dataId == VTID_REQFILE) {
  608.                 Blob += sizeof (DWORD);
  609.                 dataSize = *((PDWORD) Blob);
  610.                 if (!dataSize) {
  611.                     // should never happen
  612.                     dataSize = 1;
  613.                 }
  614.                 Blob += sizeof (DWORD);
  615.                 // if this is the first additional file, reqFile is NULL
  616. oldReqFile = reqFile;
  617.                 // dataSize includes terminating nul character
  618.                 reqFile = HeapAlloc (GetProcessHeap (), 0, prefixPathChars * sizeof (TCHAR) + dataSize);
  619.                 if (!reqFile) {
  620.                     result = FALSE;
  621.                     __leave;
  622.                 }
  623.                 lstrcpyn (reqFile, fileData.FileName, prefixPathChars + 1);
  624.                 // if this is the first additional file, oldReqFile is NULL
  625. if (oldReqFile) {
  626.                     HeapFree (GetProcessHeap (), 0, oldReqFile);
  627.                 }
  628.                 #ifdef UNICODE
  629.                     localData = (PTSTR)Blob;
  630.                 #else
  631.                     convStr = HeapAlloc (GetProcessHeap (), 0, dataSize);
  632.                     converted = WideCharToMultiByte (
  633.                                     CP_ACP,
  634.                                     0,
  635.                                     (PWSTR)Blob,
  636.                                     -1,
  637.                                     convStr,
  638.                                     dataSize,
  639.                                     NULL,
  640.                                     NULL
  641.                                     );
  642.                     if (!converted) {
  643.                         HeapFree (GetProcessHeap (), 0, convStr);
  644.                         result = FALSE;
  645.                         __leave;
  646.                     }
  647.                     localData = convStr;
  648.                 #endif
  649.                 lstrcpyn (reqFile + prefixPathChars, localData, dataSize / sizeof (TCHAR));
  650.                 reqFile [prefixPathChars + (dataSize / sizeof (TCHAR)) - 1] = 0;
  651.                 ShFreeFileData (&fileData);
  652.                 fileData.FileName = reqFile;
  653.                 if (!DoesPathExist (fileData.FileName)) {
  654.                     result = FALSE;
  655.                     __leave;
  656.                 }
  657.                 Blob += dataSize;
  658.             } else {
  659.                 if (dataId >= VTID_LASTID) {
  660.                     result = FALSE;
  661.                     __leave;
  662.                 }
  663.                 p = g_VersionData + (dataId - VTID_REQFILE - 1);
  664.                 if (p->VersionId != dataId) {
  665.                     result = FALSE;
  666.                     __leave;
  667.                 }
  668.                 Blob += sizeof (DWORD);
  669.                 dataSize = *((PDWORD) Blob);
  670.                 Blob += sizeof (DWORD);
  671.                 if (!QuickMode) {
  672.                     if (!p->VersionCheck (&fileData, dataSize, Blob)) {
  673.                         result = FALSE;
  674.                         __leave;
  675.                     }
  676.                 }
  677.                 Blob += dataSize;
  678.             }
  679.             dataId = *((PDWORD) Blob);
  680.         }
  681.     }
  682.     __finally {
  683.         if (reqFile) {
  684.             HeapFree (GetProcessHeap (), 0, reqFile);
  685.         }
  686.         ShFreeFileData (&fileData);
  687.     }
  688.     return result;
  689. }
  690. BOOL
  691. SHIsBadApp (
  692.     IN      PBADAPP_DATA Data,
  693.     OUT     PBADAPP_PROP Prop
  694.     )
  695. {
  696.     BOOL result = FALSE;
  697.     PBADAPP_PROP appProp;
  698.     __try {
  699.         if (Data->Size != sizeof (BADAPP_DATA)) {
  700.             return FALSE;
  701.         }
  702.         if (Prop->Size != sizeof (BADAPP_PROP)) {
  703.             return FALSE;
  704.         }
  705.         if (*(PDWORD)(Data->Blob) != sizeof (BADAPP_PROP)) {
  706.             return FALSE;
  707.         }
  708.         if (pShCheckBlob (Data->FilePath, Data->Blob + sizeof (BADAPP_PROP), TRUE)) {
  709.             result = pShCheckBlob (Data->FilePath, Data->Blob + sizeof (BADAPP_PROP), FALSE);
  710.         }
  711.         if (result) {
  712.             appProp = (PBADAPP_PROP) Data->Blob;
  713.             Prop->MsgId = appProp->MsgId;
  714.             Prop->AppType = appProp->AppType;
  715.         }
  716.     }
  717.     __except (1) {
  718.         result = FALSE;
  719.     }
  720.     return result;
  721. }