drv.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 9k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. // blesslnk.cpp : Program to bless a LNK file with darwin descriptor
  2. // or logo3 app name/id
  3. #include <tchar.h>
  4. #include <stdio.h>
  5. #include <windows.h>
  6. #define PRINTCASE(a) case (a): printf(TEXT("    %s"), TEXT(#a)); break;
  7. #define FLAG_HELP           0x00000001
  8. #define FLAG_DEBUG          0x00000002
  9. #define FLAG_DRIVE          0x00000004
  10. #define FLAG_FILE           0x00000008
  11. #define FLAG_MOUNTPOINT     0x00000010
  12. #define FLAG_VOLUMEGUID     0x00000020
  13. #define ARRAYSIZE(a) (sizeof((a))/sizeof((a)[0]))
  14. typedef struct _tagFLAGASSOC
  15. {
  16.     TCHAR szName;
  17.     DWORD dwFlag;
  18. } FLAGASSOC;
  19. FLAGASSOC FlagList[] = 
  20. {
  21.     { TEXT('?'), FLAG_HELP       },
  22.     { TEXT('b'), FLAG_DEBUG      },
  23.     { TEXT('d'), FLAG_DRIVE      },
  24.     { TEXT('f'), FLAG_FILE       },
  25. #if 0
  26.     { TEXT('m'), FLAG_MOUNTPOINT },
  27.     { TEXT('g'), FLAG_VOLUMEGUID },
  28. #endif
  29. };
  30. int __cdecl main(int argc, char * argv[])
  31. {
  32.     TCHAR szName[MAX_PATH];
  33.     DWORD dwFlags = 0;
  34.     BOOL fGotFileName = FALSE;
  35.     // process the args
  36.     for (int i = 1; i < argc; ++i)
  37.     {
  38.         if ((TEXT('/') == argv[i][0]) || (TEXT('-') == argv[i][0]))
  39.         {
  40.             // This is a flag
  41.             for (int j = 0; j < ARRAYSIZE(FlagList); ++j)
  42.             {
  43.                 if ((FlagList[j].szName == argv[i][1]) || 
  44.                     ((FlagList[j].szName + (TEXT('a') - TEXT('A'))) == argv[i][1]))
  45.                 {
  46.                     dwFlags |= FlagList[j].dwFlag;
  47.                     break;
  48.                 }
  49.             }
  50.         }
  51.         else
  52.         {
  53.             // This is the filename
  54.             lstrcpyn(szName, argv[i], ARRAYSIZE(szName));
  55.             fGotFileName = TRUE;
  56.         }
  57.     }
  58.     if (!fGotFileName)
  59.     {
  60.         if (!GetCurrentDirectory(ARRAYSIZE(szName), szName))
  61.         {
  62.             dwFlags = FLAG_HELP;
  63.         }
  64.     } 
  65.     if (!dwFlags)
  66.     {
  67.         dwFlags = FLAG_FILE;
  68.     }
  69.     if (dwFlags & FLAG_HELP)
  70.     {
  71.         dwFlags = FLAG_HELP;
  72.     }
  73.     if (dwFlags & FLAG_DEBUG)
  74.     {
  75.         printf("DBG: %dn", argc);
  76.         for (int i = 0; i < argc; ++i)
  77.             printf("DBG: Arg #%d is "%s"n", i, argv[i]);
  78.     }
  79.     if (dwFlags & FLAG_HELP)
  80.     {
  81.         printf(TEXT("nDRV [/F] [/D] [/B] [/?] [path]"));
  82.         printf(TEXT("nn  [path]"));
  83.         printf(TEXT("n              Specifies a drive, file, drive mounted on a folder, or Volume GUID."));
  84.         printf(TEXT("nn  /F          Retrieves file information (GetFileAttributes)."));
  85.         printf(TEXT("n  /D          Retrieves drive information (GetDriveType + GetVolumeInformation)."));
  86.         printf(TEXT("n  /B          Dumps debug info."));
  87.         printf(TEXT("n  /?          Displays this message."));
  88.         printf(TEXT("nnIf no switches are provided, '/F' is assumed.  For mounted volumes onnfolder problems, try appending a backslash.nn(Source code: shell\tools\drv)"));
  89.     }
  90.     else
  91.     {
  92.         printf(TEXT("n---------------------------------------------------n--- For: "%s""), szName);
  93.     }
  94.     if (dwFlags & FLAG_FILE)
  95.     {
  96.         // GetFileAttributes
  97.         {
  98.             printf(TEXT("n..................................................."));
  99.             printf(TEXT("n... GetFileAttributes()n"));
  100.             DWORD dwFA = GetFileAttributes(szName);
  101.             if (0xFFFFFFFF == dwFA)
  102.             {
  103.                 printf(TEXT("n    Return Value:    0x%08X"), dwFA);
  104.             }
  105.             else
  106.             {
  107.                 for (DWORD i = 0; i < 32; ++i)
  108.                 {
  109.                     DWORD dw = 1 << i;
  110.                     if (dw & dwFA)
  111.                     {
  112.                         printf(TEXT("n"));
  113.                         switch (dw)
  114.                         {
  115.                             PRINTCASE(FILE_ATTRIBUTE_READONLY           );
  116.                             PRINTCASE(FILE_ATTRIBUTE_HIDDEN             );
  117.                             PRINTCASE(FILE_ATTRIBUTE_SYSTEM             );
  118.                             PRINTCASE(FILE_ATTRIBUTE_DIRECTORY          );
  119.                             PRINTCASE(FILE_ATTRIBUTE_ARCHIVE            );
  120.                             PRINTCASE(FILE_ATTRIBUTE_DEVICE             );
  121.                             PRINTCASE(FILE_ATTRIBUTE_NORMAL             );
  122.                             PRINTCASE(FILE_ATTRIBUTE_TEMPORARY          );
  123.                             PRINTCASE(FILE_ATTRIBUTE_SPARSE_FILE        );
  124.                             PRINTCASE(FILE_ATTRIBUTE_REPARSE_POINT      );
  125.                             PRINTCASE(FILE_ATTRIBUTE_COMPRESSED         );
  126.                             PRINTCASE(FILE_ATTRIBUTE_OFFLINE            );
  127.                             PRINTCASE(FILE_ATTRIBUTE_NOT_CONTENT_INDEXED);
  128.                             PRINTCASE(FILE_ATTRIBUTE_ENCRYPTED          );
  129.                             default:
  130.                                 printf(TEXT("    %08X"), i);
  131.                                 break;
  132.                         }
  133.                     }
  134.                 }
  135.             }
  136.         }
  137.     }
  138.     if (dwFlags & FLAG_DRIVE)
  139.     {
  140.         // GetDriveType
  141.         {
  142.             printf(TEXT("n..................................................."));
  143.             printf(TEXT("n... GetDriveType()n"));
  144.             UINT u = GetDriveType(szName);
  145.             printf(TEXT("n"));
  146.             switch (u)
  147.             {
  148.                 PRINTCASE(DRIVE_UNKNOWN);
  149.                 PRINTCASE(DRIVE_NO_ROOT_DIR);
  150.                 PRINTCASE(DRIVE_REMOVABLE);
  151.                 PRINTCASE(DRIVE_FIXED);
  152.                 PRINTCASE(DRIVE_REMOTE);
  153.                 PRINTCASE(DRIVE_CDROM);
  154.                 PRINTCASE(DRIVE_RAMDISK);
  155.             }
  156.         }
  157.     }
  158.     if (dwFlags & FLAG_DRIVE)
  159.     {
  160.         // GetVolumeInformation
  161.         {
  162.             printf(TEXT("n..................................................."));
  163.             printf(TEXT("n... GetVolumeInformation()n"));
  164.                            
  165.             {
  166.                 TCHAR szVolumeName[MAX_PATH];
  167.                 DWORD dwVolSerialNumber;
  168.                 DWORD dwMaxCompName;
  169.                 DWORD dwFileSysFlags;
  170.                 TCHAR szFileSysName[MAX_PATH];
  171.                 BOOL b = GetVolumeInformation(
  172.                     szName,
  173.                     szVolumeName,
  174.                     MAX_PATH,
  175.                     &dwVolSerialNumber,
  176.                     &dwMaxCompName,
  177.                     &dwFileSysFlags,
  178.                     szFileSysName,
  179.                     MAX_PATH);
  180.                 if (!b)
  181.                 {
  182.                     printf(TEXT("n    Return Value:         %hs"), b ? "TRUE" : "FALSE");
  183.                 }
  184.                 else
  185.                 {
  186.                     printf(TEXT("n    Volume Name:          "%s""), szVolumeName);
  187.                     printf(TEXT("n    Volume Serial#:       %04X-%04X"), HIWORD(dwVolSerialNumber),
  188.                         LOWORD(dwVolSerialNumber));
  189.                     printf(TEXT("n    Volume Max Comp Name: %d"), dwMaxCompName);
  190.                     printf(TEXT("n    File System Name:     "%s""), szFileSysName);
  191.                     printf(TEXT("n    File System Flags:"));
  192.                     for (DWORD i = 0; i < 32; ++i)
  193.                     {
  194.                         DWORD dw = 1 << i;
  195.                         if (dw & dwFileSysFlags)
  196.                         {
  197.                             printf(TEXT("n    "));
  198.                             switch (dw)
  199.                             {
  200.                                 PRINTCASE(FILE_CASE_SENSITIVE_SEARCH  );
  201.                                 PRINTCASE(FILE_CASE_PRESERVED_NAMES   );
  202.                                 PRINTCASE(FILE_UNICODE_ON_DISK        );
  203.                                 PRINTCASE(FILE_PERSISTENT_ACLS        );
  204.                                 PRINTCASE(FILE_FILE_COMPRESSION       );
  205.                                 PRINTCASE(FILE_VOLUME_QUOTAS          );
  206.                                 PRINTCASE(FILE_SUPPORTS_SPARSE_FILES  );
  207.                                 PRINTCASE(FILE_SUPPORTS_REPARSE_POINTS);
  208.                                 PRINTCASE(FILE_SUPPORTS_REMOTE_STORAGE);
  209.                                 PRINTCASE(FILE_VOLUME_IS_COMPRESSED   );
  210.                                 PRINTCASE(FILE_SUPPORTS_OBJECT_IDS    );
  211.                                 PRINTCASE(FILE_SUPPORTS_ENCRYPTION    );
  212.                                 default:
  213.                                     printf(TEXT("    %08X"), i);
  214.                                     break;
  215.                             }
  216.                         }
  217.                     }
  218.                 }
  219.             }
  220.         }
  221.     }
  222.     printf(TEXT("n"));
  223.     return 0;
  224. }