JwaAdtGen.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:14k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Authz Generic Audits API interface Unit for Object Pascal                    }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: adtgen.h, released August 2001. The original Pascal    }
  9. { code is: AdtGen.pas, released October 2001. The initial developer of the     }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaAdtGen;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "adtgen.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   JwaWinNT, JwaWinType;
  52. //
  53. // type of audit 
  54. //
  55. // AUDIT_TYPE_LEGACY 
  56. //     In this case the audit event schema is stored in a .mc file.
  57. //
  58. // AUDIT_TYPE_WMI    
  59. //     The schema is stored in WMI. (currently not supported)
  60. //
  61. const
  62.   AUDIT_TYPE_LEGACY = 1;
  63.   {$EXTERNALSYM AUDIT_TYPE_LEGACY}
  64.   AUDIT_TYPE_WMI    = 2;
  65.   {$EXTERNALSYM AUDIT_TYPE_WMI}
  66. //
  67. // Type of parameters passed in the AUDIT_PARAMS.Parameters array
  68. // 
  69. // Use the AdtInitParams function to initialize and prepare 
  70. // an array of audit parameters.
  71. //
  72. type
  73.   _AUDIT_PARAM_TYPE = (
  74.     APT__0,
  75.     //
  76.     // do we need this?
  77.     //
  78.     APT_None,
  79.     //
  80.     // NULL terminated string 
  81.     //
  82.     APT_String,
  83.     //
  84.     // unsigned long
  85.     //
  86.     APT_Ulong,
  87.     //
  88.     // a pointer. use for specifying handles/pointers
  89.     // (32 bit on 32 bit systems and 64 bit on 64 bit systems)
  90.     // Note that the memory to which the pointer points to
  91.     // is not marshalled when using this type. Use this when you
  92.     // are interested in the absolute value of the pointer.
  93.     // A good example of this is when specifying HANDLE values.
  94.     //
  95.     APT_Pointer,
  96.     //
  97.     // SID
  98.     //
  99.     APT_Sid,
  100.     //
  101.     // Logon ID (LUID)
  102.     //
  103.     APT_LogonId,
  104.     //
  105.     // Object Type List
  106.     //
  107.     APT_ObjectTypeList,
  108.     //
  109.     // Luid (not translated to LogonId)
  110.     //
  111.     
  112.     APT_Luid,
  113.     
  114.     //
  115.     // Guid
  116.     //
  117.      
  118.     APT_Guid,
  119.     //
  120.     // Time (FILETIME)
  121.     //
  122.     APT_Time,
  123.     //
  124.     // ULONGLONG
  125.     // 
  126.     APT_Int64
  127.     );
  128.   {$EXTERNALSYM _AUDIT_PARAM_TYPE}
  129.   AUDIT_PARAM_TYPE = _AUDIT_PARAM_TYPE;
  130.   {$EXTERNALSYM AUDIT_PARAM_TYPE}
  131.   TAuditParamType = AUDIT_PARAM_TYPE;
  132. // 
  133. // There are two types of flags that can be used with a parameter.
  134. //
  135. // - formatting flag
  136. //   This defines the appearance of a parameter when
  137. //   written to the eventlog. Such flags may become obsolete
  138. //   when we move to WMI auditing.
  139. //
  140. // - control flag
  141. //   This causes a specified action to be taken that affects 
  142. //   a parameter value.
  143. //
  144. //   For example:
  145. //   If you use the AP_PrimaryLogonId/AP_ClientLogonId flag,
  146. //   the system will capture the logon-id from the process/thread token.
  147. //
  148. const
  149.   AP_ParamTypeBits = 8;
  150.   {$EXTERNALSYM AP_ParamTypeBits}
  151.   AP_ParamTypeMask = $000000ff;
  152.   {$EXTERNALSYM AP_ParamTypeMask}
  153. //
  154. // the flags values below have overlapping values. this is ok since
  155. // the scope of each flag is limited to the type to which it applies.
  156. //
  157. //
  158. // APT_Ulong : format flag : causes a number to appear in hex
  159. //
  160.   AP_FormatHex = ($0001 shl AP_ParamTypeBits);
  161.   {$EXTERNALSYM AP_FormatHex}
  162. //
  163. // APT_Ulong : format flag : causes a number to be treated as access-mask.
  164. //                           The meaning of each bit depends on the associated
  165. //                           object type.
  166. //
  167.   AP_AccessMask = ($0002 shl AP_ParamTypeBits);
  168.   {$EXTERNALSYM AP_AccessMask}
  169.                                                        
  170. //
  171. // APT_String : format flag : causes a string to be treated as a file-path
  172. //
  173.   AP_Filespec = ($0001 shl AP_ParamTypeBits);
  174.   {$EXTERNALSYM AP_Filespec}
  175. //
  176. // APT_LogonId : control flag : logon-id is captured from the process token
  177. //
  178.   AP_PrimaryLogonId = ($0001 shl AP_ParamTypeBits);
  179.   {$EXTERNALSYM AP_PrimaryLogonId}
  180. //
  181. // APT_LogonId : control flag : logon-id is captured from the thread token
  182. //
  183.   AP_ClientLogonId = ($0002 shl AP_ParamTypeBits);
  184.   {$EXTERNALSYM AP_ClientLogonId}
  185. //
  186. // internal helper macros
  187. //
  188. function ApExtractType(TypeFlags: DWORD): AUDIT_PARAM_TYPE;
  189. {$EXTERNALSYM ApExtractType}
  190. function ApExtractFlags(TypeFlags: DWORD): DWORD;
  191. {$EXTERNALSYM ApExtractFlags}
  192. //
  193. // Element of an object-type-list
  194. //
  195. // The AUDIT_OBJECT_TYPES structure identifies an object type element 
  196. // in a hierarchy of object types. The AccessCheckByType functions use 
  197. // an array of such structures to define a hierarchy of an object and 
  198. // its subobjects, such as property sets and properties.
  199. //
  200. type
  201.   PAUDIT_OBJECT_TYPE = ^AUDIT_OBJECT_TYPE;
  202.   {$EXTERNALSYM PAUDIT_OBJECT_TYPE}
  203.   _AUDIT_OBJECT_TYPE = record
  204.     ObjectType: GUID; // guid of the (sub)object
  205.     Flags: USHORT; // currently not defined
  206.     Level: USHORT; // level within the hierarchy.
  207.     // 0 is the root level
  208.     AccessMask: ACCESS_MASK; // access-mask for this (sub)object
  209.   end;
  210.   {$EXTERNALSYM _AUDIT_OBJECT_TYPE}
  211.   AUDIT_OBJECT_TYPE = _AUDIT_OBJECT_TYPE;
  212.   {$EXTERNALSYM AUDIT_OBJECT_TYPE}
  213.   TAuditObjectType = AUDIT_OBJECT_TYPE;
  214.   PAuditObjectType = PAUDIT_OBJECT_TYPE;
  215.   PAUDIT_OBJECT_TYPES = ^AUDIT_OBJECT_TYPES;
  216.   {$EXTERNALSYM PAUDIT_OBJECT_TYPES}
  217.   _AUDIT_OBJECT_TYPES = record
  218.     Count: USHORT; // number of object-types in pObjectTypes
  219.     Flags: USHORT; // currently not defined
  220.     pObjectTypes: PAUDIT_OBJECT_TYPE; // array of object-types
  221.   end;
  222.   {$EXTERNALSYM _AUDIT_OBJECT_TYPES}
  223.   AUDIT_OBJECT_TYPES = _AUDIT_OBJECT_TYPES;
  224.   {$EXTERNALSYM AUDIT_OBJECT_TYPES}
  225.   TAuditObjectTypes = AUDIT_OBJECT_TYPES;
  226.   PAuditObjectTypes = PAUDIT_OBJECT_TYPES;
  227. //
  228. // Structure that defines a single audit parameter.
  229. //
  230. // LsaGenAuditEvent accepts an array of such elements to
  231. // represent the parameters of the audit to be generated.
  232. //
  233. // It is best to initialize this structure using AdtInitParams function.
  234. // This will ensure compatibility with any future changes to this
  235. // structure.
  236. //
  237. type
  238.   _AUDIT_PARAM = record
  239.     Type_: AUDIT_PARAM_TYPE;     // type
  240.     Length: ULONG;               // currently unused
  241.     Flags: DWORD;                // currently unused
  242.     U: record
  243.     case Integer of
  244.       0: (Data0: ULONG_PTR);
  245.       1: (String_: PWSTR);
  246.       2: (u: ULONG_PTR);
  247.       3: (psid: PSID);
  248.       4: (pguid: LPGUID);      
  249.       5: (LogonId_LowPart: ULONG);
  250.       6: (pObjectTypes: PAUDIT_OBJECT_TYPES);
  251.     end;
  252.     case Integer of
  253.       0: (Data1: ULONG_PTR);
  254.       1: (LogonId_HighPart: LONG);
  255.   end;
  256.   {$EXTERNALSYM _AUDIT_PARAM}
  257.   AUDIT_PARAM = _AUDIT_PARAM;
  258.   {$EXTERNALSYM AUDIT_PARAM}
  259.   PAUDIT_PARAM = ^AUDIT_PARAM;
  260.   {$EXTERNALSYM PAUDIT_PARAM}
  261.   TAuditParam = AUDIT_PARAM;
  262.   PAuditParam = PAUDIT_PARAM;
  263. //
  264. // Audit control flags. To be used with AUDIT_PARAMS.Flags
  265. //
  266. const
  267.   APF_AuditFailure = $00000000; // generate a failure audit
  268.   {$EXTERNALSYM APF_AuditFailure}
  269.   APF_AuditSuccess = $00000001; // generate a success audit when set, a failure audit otherwise.
  270.   {$EXTERNALSYM APF_AuditSuccess}
  271. //
  272. // set of valid audit control flags 
  273. //
  274.   APF_ValidFlags = (APF_AuditSuccess);
  275.   {$EXTERNALSYM APF_ValidFlags}
  276. //
  277. // Audit parameters passed to LsaGenAuditEvent
  278. //
  279. type
  280.   PAUDIT_PARAMS = ^AUDIT_PARAMS;
  281.   {$EXTERNALSYM PAUDIT_PARAMS}
  282.   _AUDIT_PARAMS = record
  283.     Length: ULONG; // size in bytes
  284.     Flags: DWORD; // currently unused
  285.     Count: USHORT; // number of parameters
  286.     Parameters: PAUDIT_PARAM; // array of parameters
  287.   end;
  288.   {$EXTERNALSYM _AUDIT_PARAMS}
  289.   AUDIT_PARAMS = _AUDIT_PARAMS;
  290.   {$EXTERNALSYM AUDIT_PARAMS}
  291.   TAuditParams = AUDIT_PARAMS;
  292.   PAuditParams = PAUDIT_PARAMS;
  293. //
  294. // Defines the elements of a legacy audit event.
  295. //
  296.   PAUTHZ_AUDIT_EVENT_TYPE_LEGACY = ^AUTHZ_AUDIT_EVENT_TYPE_LEGACY;
  297.   {$EXTERNALSYM PAUTHZ_AUDIT_EVENT_TYPE_LEGACY}
  298.   _AUTHZ_AUDIT_EVENT_TYPE_LEGACY = record
  299.     //
  300.     // Audit category ID
  301.     //
  302.     CategoryId: USHORT;
  303.     //
  304.     // Audit event ID
  305.     //
  306.     AuditId: USHORT;
  307.     //
  308.     // Parameter count
  309.     //
  310.     ParameterCount: USHORT;
  311.   end;
  312.   {$EXTERNALSYM _AUTHZ_AUDIT_EVENT_TYPE_LEGACY}
  313.   AUTHZ_AUDIT_EVENT_TYPE_LEGACY = _AUTHZ_AUDIT_EVENT_TYPE_LEGACY;
  314.   {$EXTERNALSYM AUTHZ_AUDIT_EVENT_TYPE_LEGACY}
  315.   TAuthzAuditEventTypeLegacy = AUTHZ_AUDIT_EVENT_TYPE_LEGACY;
  316.   PAuthzAuditEventTypeLegacy = PAUTHZ_AUDIT_EVENT_TYPE_LEGACY;
  317.   _AUTHZ_AUDIT_EVENT_TYPE_UNION = record
  318.     case Integer of
  319.       0: (Legacy: AUTHZ_AUDIT_EVENT_TYPE_LEGACY);
  320.   end;
  321.   {$EXTERNALSYM _AUTHZ_AUDIT_EVENT_TYPE_UNION}
  322.   AUTHZ_AUDIT_EVENT_TYPE_UNION = _AUTHZ_AUDIT_EVENT_TYPE_UNION;
  323.   {$EXTERNALSYM AUTHZ_AUDIT_EVENT_TYPE_UNION}
  324.   PAUTHZ_AUDIT_EVENT_TYPE_UNION = ^AUTHZ_AUDIT_EVENT_TYPE_UNION;
  325.   {$EXTERNALSYM PAUTHZ_AUDIT_EVENT_TYPE_UNION}
  326.   TAuthzAuditEventTypeUnion = AUTHZ_AUDIT_EVENT_TYPE_UNION;
  327.   PAuthzAuditEventTypeUnion = PAUTHZ_AUDIT_EVENT_TYPE_UNION;  
  328. //
  329. // description of an audit event
  330. //
  331.   _AUTHZ_AUDIT_EVENT_TYPE_OLD = record
  332.     // version number
  333.     Version: ULONG;
  334.     dwFlags: DWORD;
  335.     RefCount: LONG;
  336.     hAudit: ULONG_PTR;
  337.     LinkId: LUID;
  338.     u: AUTHZ_AUDIT_EVENT_TYPE_UNION;
  339.   end;
  340.   {$EXTERNALSYM _AUTHZ_AUDIT_EVENT_TYPE_OLD}
  341.   AUTHZ_AUDIT_EVENT_TYPE_OLD = _AUTHZ_AUDIT_EVENT_TYPE_OLD;
  342.   {$EXTERNALSYM AUTHZ_AUDIT_EVENT_TYPE_OLD}
  343.   TAuthzAuditEventTypeOld = AUTHZ_AUDIT_EVENT_TYPE_OLD;
  344.   PAuthzAuditEventTypeOld = ^AUTHZ_AUDIT_EVENT_TYPE_OLD;
  345.   PAUTHZ_AUDIT_EVENT_TYPE_OLD = ^AUTHZ_AUDIT_EVENT_TYPE_OLD;
  346.   {$EXTERNALSYM PAUTHZ_AUDIT_EVENT_TYPE_OLD}
  347.   AUDIT_HANDLE = PVOID;
  348.   {$EXTERNALSYM AUDIT_HANDLE}
  349.   PAUDIT_HANDLE = ^AUDIT_HANDLE;
  350.   {$EXTERNALSYM PAUDIT_HANDLE}
  351. function AuthzpRegisterAuditEvent(pAuditEventType: PAUTHZ_AUDIT_EVENT_TYPE_OLD; var phAuditContext: AUDIT_HANDLE): BOOL; stdcall;
  352. {$EXTERNALSYM AuthzpRegisterAuditEvent}
  353. function AuthzpUnregisterAuditEvent(var phAuditContext: AUDIT_HANDLE): BOOL; stdcall;
  354. {$EXTERNALSYM AuthzpUnregisterAuditEvent}
  355. implementation
  356. const
  357.   authz_lib = 'authz.dll';
  358. function ApExtractType(TypeFlags: DWORD): AUDIT_PARAM_TYPE;
  359. begin
  360.   Result := AUDIT_PARAM_TYPE(TypeFlags and AP_ParamTypeMask);
  361. end;
  362. function ApExtractFlags(TypeFlags: DWORD): DWORD;
  363. begin
  364.   Result := TypeFlags and not AP_ParamTypeMask;
  365. end;
  366. {$IFDEF DYNAMIC_LINK}
  367. var
  368.   _AuthzpRegisterAuditEvent: Pointer;
  369. function AuthzpRegisterAuditEvent;
  370. begin
  371.   GetProcedureAddress(_AuthzpRegisterAuditEvent, authz_lib, 'AuthzpRegisterAuditEvent');
  372.   asm
  373.     mov esp, ebp
  374.     pop ebp
  375.     jmp [_AuthzpRegisterAuditEvent]
  376.   end;
  377. end;
  378. {$ELSE}
  379. function AuthzpRegisterAuditEvent; external authz_lib name 'AuthzpRegisterAuditEvent';
  380. {$ENDIF DYNAMIC_LINK}
  381. {$IFDEF DYNAMIC_LINK}
  382. var
  383.   _AuthzpUnregisterAuditEvent: Pointer;
  384. function AuthzpUnregisterAuditEvent;
  385. begin
  386.   GetProcedureAddress(_AuthzpUnregisterAuditEvent, authz_lib, 'AuthzpUnregisterAuditEvent');
  387.   asm
  388.     mov esp, ebp
  389.     pop ebp
  390.     jmp [_AuthzpUnregisterAuditEvent]
  391.   end;
  392. end;
  393. {$ELSE}
  394. function AuthzpUnregisterAuditEvent; external authz_lib name 'AuthzpUnregisterAuditEvent';
  395. {$ENDIF DYNAMIC_LINK}
  396. end.