Subversion Repositories userdetect2

Rev

Blame | Last modification | View Log | RSS feed

  1. #ifndef _UD2_STATUS_H_
  2. #define _UD2_STATUS_H_
  3.  
  4. #include <stdio.h>
  5.  
  6. #include "ud2_api.h"
  7.  
  8. typedef WORD  UD2_STATUSCAT;
  9. typedef GUID  UD2_STATUSAUTH;
  10. typedef DWORD UD2_STATUSMSG;
  11. typedef DWORD UD2_STATUSEXTRAINFO;
  12.  
  13. #pragma pack(push, 1) // no alignment
  14. typedef struct _UD2_STATUS {
  15.     BYTE                cbSize;
  16.     BYTE                bReserved;
  17.     UD2_STATUSCAT       wCategory;
  18.     UD2_STATUSAUTH      grAuthority;
  19.     UD2_STATUSMSG       dwMessage;
  20.     UD2_STATUSEXTRAINFO dwExtraInfo;
  21. } UD2_STATUS;
  22. #pragma pack(pop) // restore previous pack value
  23.  
  24. const UD2_STATUSCAT UD2_STATUSCAT_SUCCESS   = 0;
  25. const UD2_STATUSCAT UD2_STATUSCAT_NOT_AVAIL = 1;
  26. const UD2_STATUSCAT UD2_STATUSCAT_FAILED    = 2;
  27.  
  28. const UD2_STATUSAUTH UD2_STATUSAUTH_GENERIC = __GUID("{90F53368-1EFB-4350-A6BC-725C69938B9C}");
  29.  
  30. const UD2_STATUS UD2_STATUS_OK_UNSPECIFIED = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_SUCCESS, UD2_STATUSAUTH_GENERIC, 0, 0 };
  31. const UD2_STATUS UD2_STATUS_OK_SINGLELINE  = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_SUCCESS, UD2_STATUSAUTH_GENERIC, 1, 0 };
  32. const UD2_STATUS UD2_STATUS_OK_MULTILINE   = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_SUCCESS, UD2_STATUSAUTH_GENERIC, 2, 0 };
  33. const UD2_STATUS UD2_STATUS_OK_LICENSED    = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_SUCCESS, UD2_STATUSAUTH_GENERIC, 3, 0 };
  34.  
  35. const UD2_STATUS UD2_STATUS_NOTAVAIL_UNSPECIFIED         = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_NOT_AVAIL, UD2_STATUSAUTH_GENERIC, 0, 0 };
  36. const UD2_STATUS UD2_STATUS_NOTAVAIL_OS_NOT_SUPPORTED    = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_NOT_AVAIL, UD2_STATUSAUTH_GENERIC, 1, 0 };
  37. const UD2_STATUS UD2_STATUS_NOTAVAIL_HW_NOT_SUPPORTED    = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_NOT_AVAIL, UD2_STATUSAUTH_GENERIC, 2, 0 };
  38. const UD2_STATUS UD2_STATUS_NOTAVAIL_NO_ENTITIES         = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_NOT_AVAIL, UD2_STATUSAUTH_GENERIC, 3, 0 };
  39. const UD2_STATUS UD2_STATUS_NOTAVAIL_WINAPI_CALL_FAILURE = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_NOT_AVAIL, UD2_STATUSAUTH_GENERIC, 4, 0 };
  40.  
  41. const UD2_STATUS UD2_STATUS_FAILURE_UNSPECIFIED         = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_FAILED, UD2_STATUSAUTH_GENERIC, 0, 0 };
  42. const UD2_STATUS UD2_STATUS_FAILURE_BUFFER_TOO_SMALL    = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_FAILED, UD2_STATUSAUTH_GENERIC, 1, 0 };
  43. const UD2_STATUS UD2_STATUS_FAILURE_INVALID_ARGS        = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_FAILED, UD2_STATUSAUTH_GENERIC, 2, 0 };
  44. const UD2_STATUS UD2_STATUS_FAILURE_PLUGIN_NOT_LICENSED = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_FAILED, UD2_STATUSAUTH_GENERIC, 3, 0 };
  45.  
  46. int UD2_STATUS_FormatStatusCode(char* szStr, size_t cchLen, UD2_STATUS grStatus) {
  47.         // 00 0000 {44332211-1234-ABCD-EFEF-001122334455} 00000000 00000000
  48.         if (cchLen < 73) szStr = NULL; // incl. null-terminator
  49.         return sprintf(szStr, "%02x %04x {%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX} %08x %08x",
  50.                 grStatus.bReserved,
  51.                 grStatus.wCategory,
  52.                 grStatus.grAuthority,
  53.                 grStatus.grAuthority.Data1, grStatus.grAuthority.Data2, grStatus.grAuthority.Data3,
  54.                         grStatus.grAuthority.Data4[0], grStatus.grAuthority.Data4[1], grStatus.grAuthority.Data4[2], grStatus.grAuthority.Data4[3],
  55.                         grStatus.grAuthority.Data4[4], grStatus.grAuthority.Data4[5], grStatus.grAuthority.Data4[6], grStatus.grAuthority.Data4[7],
  56.                 grStatus.dwMessage,
  57.                 grStatus.dwExtraInfo); 
  58. }
  59.  
  60. bool UD2_STATUS_Equal(UD2_STATUS grStatus1, UD2_STATUS grStatus2, bool compareExtraInfo) {
  61.         return (grStatus1.bReserved == grStatus2.bReserved) &&
  62.                 (grStatus1.wCategory == grStatus2.wCategory) &&
  63.                 IsEqualGUID(grStatus1.grAuthority, grStatus2.grAuthority) &&
  64.                 (grStatus1.dwMessage == grStatus2.dwMessage);
  65.                
  66.         if (compareExtraInfo && (grStatus1.dwExtraInfo != grStatus2.dwExtraInfo)) return false;
  67. }
  68.  
  69. #ifdef __cplusplus
  70. bool operator==(const UD2_STATUS& lhs, const UD2_STATUS& rhs) {
  71.         return UD2_STATUS_Equal(lhs, rhs, true);
  72. }
  73. #endif
  74.  
  75. UD2_STATUS UD2_STATUS_OSError(DWORD dwOSError) {
  76.         UD2_STATUS ret = UD2_STATUS_NOTAVAIL_WINAPI_CALL_FAILURE;
  77.         ret.dwExtraInfo = dwOSError;   
  78.         return ret;
  79. }
  80.  
  81. #endif
  82.