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

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Encrypting File System 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: winefs.h, released June 2000. The original Pascal      }
  9. { code is: WinEFS.pas, released December 2000. 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 JwaWinEFS;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "WinEFS.h"'}
  47. {$HPPEMIT ''}
  48. {$HPPEMIT 'typedef PENCRYPTION_CERTIFICATE_HASH *PPENCRYPTION_CERTIFICATE_HASH'}
  49. {$HPPEMIT 'typedef PENCRYPTION_CERTIFICATE *PPENCRYPTION_CERTIFICATE'}
  50. {$HPPEMIT 'typedef PENCRYPTION_CERTIFICATE_HASH_LIST *PPENCRYPTION_CERTIFICATE_HASH_LIST'}
  51. {$HPPEMIT ''}
  52. {$I WINDEFINES.INC}
  53. interface
  54. uses
  55.   JwaWinBase, JwaWinNT, JwaWinType;
  56. type
  57.   ALG_ID = Cardinal;
  58.   {$EXTERNALSYM ALG_ID}
  59. //
  60. //  Encoded Certificate
  61. //
  62. type
  63.   PEFS_CERTIFICATE_BLOB = ^EFS_CERTIFICATE_BLOB;
  64.   {$EXTERNALSYM PEFS_CERTIFICATE_BLOB}
  65.   _CERTIFICATE_BLOB = record
  66.     dwCertEncodingType: DWORD;
  67.     cbData: DWORD;
  68.     pbData: PBYTE;
  69.   end;
  70.   {$EXTERNALSYM _CERTIFICATE_BLOB}
  71.   EFS_CERTIFICATE_BLOB = _CERTIFICATE_BLOB;
  72.   {$EXTERNALSYM EFS_CERTIFICATE_BLOB}
  73.   TEfsCertificateBlob = EFS_CERTIFICATE_BLOB;
  74.   PEfsCertificateBlob = PEFS_CERTIFICATE_BLOB;
  75. //
  76. //  Certificate Hash
  77. //
  78.   PEFS_HASH_BLOB = ^EFS_HASH_BLOB;
  79.   {$EXTERNALSYM PEFS_HASH_BLOB}
  80.   _EFS_HASH_BLOB = record
  81.     cbData: DWORD;
  82.     pbData: PBYTE;
  83.   end;
  84.   {$EXTERNALSYM _EFS_HASH_BLOB}
  85.   EFS_HASH_BLOB = _EFS_HASH_BLOB;
  86.   {$EXTERNALSYM EFS_HASH_BLOB}
  87.   TEfsHashBlob = EFS_HASH_BLOB;
  88.   PEfsHashBlob = PEFS_HASH_BLOB;
  89. //
  90. //  RPC blob
  91. //
  92.   _EFS_RPC_BLOB = record
  93.     cbData: DWORD;
  94.     pbData: PBYTE;
  95.   end;
  96.   {$EXTERNALSYM _EFS_RPC_BLOB}
  97.   EFS_RPC_BLOB = _EFS_RPC_BLOB;
  98.   {$EXTERNALSYM EFS_RPC_BLOB}
  99.   PEFS_RPC_BLOB = ^EFS_RPC_BLOB;
  100.   {$EXTERNALSYM PEFS_RPC_BLOB}
  101.   TEfsRpcBlob = EFS_RPC_BLOB;
  102.   PEfsRpcBlob = PEFS_RPC_BLOB;
  103.   _EFS_KEY_INFO = record
  104.     dwVersion: DWORD;
  105.     Entropy: ULONG;
  106.     Algorithm: ALG_ID;
  107.     KeyLength: ULONG;
  108.   end;
  109.   {$EXTERNALSYM _EFS_KEY_INFO}
  110.   EFS_KEY_INFO = _EFS_KEY_INFO;
  111.   {$EXTERNALSYM EFS_KEY_INFO}
  112.   PEFS_KEY_INFO = ^EFS_KEY_INFO;
  113.   {$EXTERNALSYM PEFS_KEY_INFO}
  114.   TEfsKeyInfo = EFS_KEY_INFO;
  115.   PEfsKeyInfo = PEFS_KEY_INFO;
  116. //
  117. // Input to add a user to an encrypted file
  118. //
  119.   PENCRYPTION_CERTIFICATE = ^ENCRYPTION_CERTIFICATE;
  120.   {$EXTERNALSYM PENCRYPTION_CERTIFICATE}
  121.   _ENCRYPTION_CERTIFICATE = record
  122.     cbTotalLength: DWORD;
  123.     pUserSid: PSID;
  124.     pCertBlob: PEFS_CERTIFICATE_BLOB;
  125.   end;
  126.   {$EXTERNALSYM _ENCRYPTION_CERTIFICATE}
  127.   ENCRYPTION_CERTIFICATE = _ENCRYPTION_CERTIFICATE;
  128.   {$EXTERNALSYM ENCRYPTION_CERTIFICATE}
  129.   TEncryptionCertificate = ENCRYPTION_CERTIFICATE;
  130.   PEncryptionCertificate = PENCRYPTION_CERTIFICATE;
  131. const
  132.   MAX_SID_SIZE = 256;
  133.   {$EXTERNALSYM MAX_SID_SIZE}
  134. type
  135.   PENCRYPTION_CERTIFICATE_HASH = ^ENCRYPTION_CERTIFICATE_HASH;
  136.   {$EXTERNALSYM PENCRYPTION_CERTIFICATE_HASH}
  137.   _ENCRYPTION_CERTIFICATE_HASH = record
  138.     cbTotalLength: DWORD;
  139.     pUserSid: PSID;
  140.     pHash: PEFS_HASH_BLOB;
  141.     lpDisplayInformation: LPWSTR;
  142.   end;
  143.   {$EXTERNALSYM _ENCRYPTION_CERTIFICATE_HASH}
  144.   ENCRYPTION_CERTIFICATE_HASH = _ENCRYPTION_CERTIFICATE_HASH;
  145.   {$EXTERNALSYM ENCRYPTION_CERTIFICATE_HASH}
  146.   TEncryptionCertificateHash = ENCRYPTION_CERTIFICATE_HASH;
  147.   PEncryptionCertificateHash = PENCRYPTION_CERTIFICATE_HASH;
  148.   PPENCRYPTION_CERTIFICATE_HASH = ^PENCRYPTION_CERTIFICATE_HASH;
  149.   {$NODEFINE PPENCRYPTION_CERTIFICATE_HASH}
  150.   PENCRYPTION_CERTIFICATE_HASH_LIST = ^ENCRYPTION_CERTIFICATE_HASH_LIST;
  151.   {$EXTERNALSYM PENCRYPTION_CERTIFICATE_HASH_LIST}
  152.   _ENCRYPTION_CERTIFICATE_HASH_LIST = record
  153.     nCert_Hash: DWORD;
  154.     pUsers: PPENCRYPTION_CERTIFICATE_HASH;
  155.   end;
  156.   {$EXTERNALSYM _ENCRYPTION_CERTIFICATE_HASH_LIST}
  157.   ENCRYPTION_CERTIFICATE_HASH_LIST = _ENCRYPTION_CERTIFICATE_HASH_LIST;
  158.   {$EXTERNALSYM ENCRYPTION_CERTIFICATE_HASH_LIST}
  159.   TEncryptionCertificateHashList = ENCRYPTION_CERTIFICATE_HASH_LIST;
  160.   PEncryptionCertificateHashList = PENCRYPTION_CERTIFICATE_HASH_LIST;
  161.   PPENCRYPTION_CERTIFICATE = ^PENCRYPTION_CERTIFICATE;
  162.   {$NODEFINE PPENCRYPTION_CERTIFICATE}
  163.   PENCRYPTION_CERTIFICATE_LIST = ^ENCRYPTION_CERTIFICATE_LIST;
  164.   {$EXTERNALSYM PENCRYPTION_CERTIFICATE_LIST}
  165.   _ENCRYPTION_CERTIFICATE_LIST = record
  166.     nUsers: DWORD;
  167.     pUsers: PPENCRYPTION_CERTIFICATE;
  168.   end;
  169.   {$EXTERNALSYM _ENCRYPTION_CERTIFICATE_LIST}
  170.   ENCRYPTION_CERTIFICATE_LIST = _ENCRYPTION_CERTIFICATE_LIST;
  171.   {$EXTERNALSYM ENCRYPTION_CERTIFICATE_LIST}
  172.   TEncryptionCertificateList = ENCRYPTION_CERTIFICATE_LIST;
  173.   PEncryptionCertificateList = PENCRYPTION_CERTIFICATE_LIST;
  174.   PPENCRYPTION_CERTIFICATE_HASH_LIST = ^PENCRYPTION_CERTIFICATE_HASH_LIST;
  175.   {$NODEFINE PPENCRYPTION_CERTIFICATE_HASH_LIST}
  176. function QueryUsersOnEncryptedFile(lpFileName: LPCWSTR;
  177.   var pUsers: PENCRYPTION_CERTIFICATE_HASH_LIST): DWORD; stdcall;
  178. {$EXTERNALSYM QueryUsersOnEncryptedFile}
  179. function QueryRecoveryAgentsOnEncryptedFile(lpFileName: LPCWSTR;
  180.   var pRecoveryAgents: PENCRYPTION_CERTIFICATE_HASH_LIST): DWORD; stdcall;
  181. {$EXTERNALSYM QueryRecoveryAgentsOnEncryptedFile}
  182. function RemoveUsersFromEncryptedFile(lpFileName: LPCWSTR;
  183.   pHashes: PENCRYPTION_CERTIFICATE_HASH_LIST): DWORD; stdcall;
  184. {$EXTERNALSYM RemoveUsersFromEncryptedFile}
  185. function AddUsersToEncryptedFile(lpFileName: LPCWSTR;
  186.   pUsers: PENCRYPTION_CERTIFICATE_LIST): DWORD; stdcall;
  187. {$EXTERNALSYM AddUsersToEncryptedFile}
  188. function SetUserFileEncryptionKey(pEncryptionCertificate: PENCRYPTION_CERTIFICATE): DWORD; stdcall;
  189. {$EXTERNALSYM SetUserFileEncryptionKey}
  190. procedure FreeEncryptionCertificateHashList(pHashes: PENCRYPTION_CERTIFICATE_HASH_LIST); stdcall;
  191. {$EXTERNALSYM FreeEncryptionCertificateHashList}
  192. function EncryptionDisable(DirPath: LPCWSTR; Disable: BOOL): BOOL; stdcall;
  193. {$EXTERNALSYM EncryptionDisable}
  194. function DuplicateEncryptionInfoFile(SrcFileName, DstFileName: LPCWSTR; dwCreationDistribution,
  195.   dwAttributes: DWORD; lpSecurityAttributes: LPSECURITY_ATTRIBUTES): DWORD; stdcall;
  196. {$EXTERNALSYM DuplicateEncryptionInfoFile}
  197. implementation
  198. const
  199.   advapi32 = 'advapi32.dll';
  200. {$IFDEF DYNAMIC_LINK}
  201. var
  202.   _QueryUsersOnEncryptedFile: Pointer;
  203. function QueryUsersOnEncryptedFile;
  204. begin
  205.   GetProcedureAddress(_QueryUsersOnEncryptedFile, advapi32, 'QueryUsersOnEncryptedFile');
  206.   asm
  207.     mov esp, ebp
  208.     pop ebp
  209.     jmp [_QueryUsersOnEncryptedFile]
  210.   end;
  211. end;
  212. {$ELSE}
  213. function QueryUsersOnEncryptedFile; external advapi32 name 'QueryUsersOnEncryptedFile';
  214. {$ENDIF DYNAMIC_LINK}
  215. {$IFDEF DYNAMIC_LINK}
  216. var
  217.   _QueryRecoveryAgentsOnEncrFile: Pointer;
  218. function QueryRecoveryAgentsOnEncryptedFile;
  219. begin
  220.   GetProcedureAddress(_QueryRecoveryAgentsOnEncrFile, advapi32, 'QueryRecoveryAgentsOnEncryptedFile');
  221.   asm
  222.     mov esp, ebp
  223.     pop ebp
  224.     jmp [_QueryRecoveryAgentsOnEncrFile]
  225.   end;
  226. end;
  227. {$ELSE}
  228. function QueryRecoveryAgentsOnEncryptedFile; external advapi32 name 'QueryRecoveryAgentsOnEncryptedFile';
  229. {$ENDIF DYNAMIC_LINK}
  230. {$IFDEF DYNAMIC_LINK}
  231. var
  232.   _RemoveUsersFromEncryptedFile: Pointer;
  233. function RemoveUsersFromEncryptedFile;
  234. begin
  235.   GetProcedureAddress(_RemoveUsersFromEncryptedFile, advapi32, 'RemoveUsersFromEncryptedFile');
  236.   asm
  237.     mov esp, ebp
  238.     pop ebp
  239.     jmp [_RemoveUsersFromEncryptedFile]
  240.   end;
  241. end;
  242. {$ELSE}
  243. function RemoveUsersFromEncryptedFile; external advapi32 name 'RemoveUsersFromEncryptedFile';
  244. {$ENDIF DYNAMIC_LINK}
  245. {$IFDEF DYNAMIC_LINK}
  246. var
  247.   _AddUsersToEncryptedFile: Pointer;
  248. function AddUsersToEncryptedFile;
  249. begin
  250.   GetProcedureAddress(_AddUsersToEncryptedFile, advapi32, 'AddUsersToEncryptedFile');
  251.   asm
  252.     mov esp, ebp
  253.     pop ebp
  254.     jmp [_AddUsersToEncryptedFile]
  255.   end;
  256. end;
  257. {$ELSE}
  258. function AddUsersToEncryptedFile; external advapi32 name 'AddUsersToEncryptedFile';
  259. {$ENDIF DYNAMIC_LINK}
  260. {$IFDEF DYNAMIC_LINK}
  261. var
  262.   _SetUserFileEncryptionKey: Pointer;
  263. function SetUserFileEncryptionKey;
  264. begin
  265.   GetProcedureAddress(_SetUserFileEncryptionKey, advapi32, 'SetUserFileEncryptionKey');
  266.   asm
  267.     mov esp, ebp
  268.     pop ebp
  269.     jmp [_SetUserFileEncryptionKey]
  270.   end;
  271. end;
  272. {$ELSE}
  273. function SetUserFileEncryptionKey; external advapi32 name 'SetUserFileEncryptionKey';
  274. {$ENDIF DYNAMIC_LINK}
  275. {$IFDEF DYNAMIC_LINK}
  276. var
  277.   _FreeEncrCertificateHashList: Pointer;
  278. procedure FreeEncryptionCertificateHashList;
  279. begin
  280.   GetProcedureAddress(_FreeEncrCertificateHashList, advapi32, 'FreeEncryptionCertificateHashList');
  281.   asm
  282.     mov esp, ebp
  283.     pop ebp
  284.     jmp [_FreeEncrCertificateHashList]
  285.   end;
  286. end;
  287. {$ELSE}
  288. procedure FreeEncryptionCertificateHashList; external advapi32 name 'FreeEncryptionCertificateHashList';
  289. {$ENDIF DYNAMIC_LINK}
  290. {$IFDEF DYNAMIC_LINK}
  291. var
  292.   _EncryptionDisable: Pointer;
  293. function EncryptionDisable;
  294. begin
  295.   GetProcedureAddress(_EncryptionDisable, advapi32, 'EncryptionDisable');
  296.   asm
  297.     mov esp, ebp
  298.     pop ebp
  299.     jmp [_EncryptionDisable]
  300.   end;
  301. end;
  302. {$ELSE}
  303. function EncryptionDisable; external advapi32 name 'EncryptionDisable';
  304. {$ENDIF DYNAMIC_LINK}
  305. {$IFDEF DYNAMIC_LINK}
  306. var
  307.   _DuplicateEncryptionInfoFile: Pointer;
  308. function DuplicateEncryptionInfoFile;
  309. begin
  310.   GetProcedureAddress(_DuplicateEncryptionInfoFile, advapi32, 'DuplicateEncryptionInfoFile');
  311.   asm
  312.     mov esp, ebp
  313.     pop ebp
  314.     jmp [_DuplicateEncryptionInfoFile]
  315.   end;
  316. end;
  317. {$ELSE}
  318. function DuplicateEncryptionInfoFile; external advapi32 name 'DuplicateEncryptionInfoFile';
  319. {$ENDIF DYNAMIC_LINK}
  320. end.