jwawinefs.pas 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  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 att chello dott 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 }
  18. { APILIB home page, located at http://jedi-apilib.sourceforge.net }
  19. { }
  20. { The contents of this file are used with permission, subject to the Mozilla }
  21. { Public License Version 1.1 (the "License"); you may not use this file except }
  22. { in compliance with the License. You may obtain a copy of the License at }
  23. { http://www.mozilla.org/MPL/MPL-1.1.html }
  24. { }
  25. { Software distributed under the License is distributed on an "AS IS" basis, }
  26. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  27. { the specific language governing rights and limitations under the License. }
  28. { }
  29. { Alternatively, the contents of this file may be used under the terms of the }
  30. { GNU Lesser General Public License (the "LGPL License"), in which case the }
  31. { provisions of the LGPL License are applicable instead of those above. }
  32. { If you wish to allow use of your version of this file only under the terms }
  33. { of the LGPL License and not to allow others to use your version of this file }
  34. { under the MPL, indicate your decision by deleting the provisions above and }
  35. { replace them with the notice and other provisions required by the LGPL }
  36. { License. If you do not delete the provisions above, a recipient may use }
  37. { your version of this file under either the MPL or the LGPL License. }
  38. { }
  39. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  40. { }
  41. {******************************************************************************}
  42. // $Id: JwaWinEFS.pas,v 1.8 2005/09/06 16:36:50 marquardt Exp $
  43. {$IFNDEF JWA_INCLUDEMODE}
  44. unit JwaWinEFS;
  45. {$WEAKPACKAGEUNIT}
  46. {$I jediapilib.inc}
  47. interface
  48. uses
  49. JwaWinBase, JwaWinNT, JwaWinType;
  50. {$ENDIF !JWA_INCLUDEMODE}
  51. {$IFDEF JWA_INTERFACESECTION}
  52. {$HPPEMIT ''}
  53. {$HPPEMIT '#include "WinEFS.h"'}
  54. {$HPPEMIT ''}
  55. {$HPPEMIT 'typedef PENCRYPTION_CERTIFICATE_HASH *PPENCRYPTION_CERTIFICATE_HASH'}
  56. {$HPPEMIT 'typedef PENCRYPTION_CERTIFICATE *PPENCRYPTION_CERTIFICATE'}
  57. {$HPPEMIT 'typedef PENCRYPTION_CERTIFICATE_HASH_LIST *PPENCRYPTION_CERTIFICATE_HASH_LIST'}
  58. {$HPPEMIT ''}
  59. {$IFNDEF JWA_INCLUDEMODE}
  60. type
  61. ALG_ID = Cardinal;
  62. {$EXTERNALSYM ALG_ID}
  63. {$ENDIF !JWA_INCLUDEMODE}
  64. //
  65. // Encoded Certificate
  66. //
  67. type
  68. PEFS_CERTIFICATE_BLOB = ^EFS_CERTIFICATE_BLOB;
  69. {$EXTERNALSYM PEFS_CERTIFICATE_BLOB}
  70. _CERTIFICATE_BLOB = record
  71. dwCertEncodingType: DWORD;
  72. cbData: DWORD;
  73. pbData: PBYTE;
  74. end;
  75. {$EXTERNALSYM _CERTIFICATE_BLOB}
  76. EFS_CERTIFICATE_BLOB = _CERTIFICATE_BLOB;
  77. {$EXTERNALSYM EFS_CERTIFICATE_BLOB}
  78. TEfsCertificateBlob = EFS_CERTIFICATE_BLOB;
  79. PEfsCertificateBlob = PEFS_CERTIFICATE_BLOB;
  80. //
  81. // Certificate Hash
  82. //
  83. PEFS_HASH_BLOB = ^EFS_HASH_BLOB;
  84. {$EXTERNALSYM PEFS_HASH_BLOB}
  85. _EFS_HASH_BLOB = record
  86. cbData: DWORD;
  87. pbData: PBYTE;
  88. end;
  89. {$EXTERNALSYM _EFS_HASH_BLOB}
  90. EFS_HASH_BLOB = _EFS_HASH_BLOB;
  91. {$EXTERNALSYM EFS_HASH_BLOB}
  92. TEfsHashBlob = EFS_HASH_BLOB;
  93. PEfsHashBlob = PEFS_HASH_BLOB;
  94. //
  95. // RPC blob
  96. //
  97. _EFS_RPC_BLOB = record
  98. cbData: DWORD;
  99. pbData: PBYTE;
  100. end;
  101. {$EXTERNALSYM _EFS_RPC_BLOB}
  102. EFS_RPC_BLOB = _EFS_RPC_BLOB;
  103. {$EXTERNALSYM EFS_RPC_BLOB}
  104. PEFS_RPC_BLOB = ^EFS_RPC_BLOB;
  105. {$EXTERNALSYM PEFS_RPC_BLOB}
  106. TEfsRpcBlob = EFS_RPC_BLOB;
  107. PEfsRpcBlob = PEFS_RPC_BLOB;
  108. _EFS_KEY_INFO = record
  109. dwVersion: DWORD;
  110. Entropy: ULONG;
  111. Algorithm: ALG_ID;
  112. KeyLength: ULONG;
  113. end;
  114. {$EXTERNALSYM _EFS_KEY_INFO}
  115. EFS_KEY_INFO = _EFS_KEY_INFO;
  116. {$EXTERNALSYM EFS_KEY_INFO}
  117. PEFS_KEY_INFO = ^EFS_KEY_INFO;
  118. {$EXTERNALSYM PEFS_KEY_INFO}
  119. TEfsKeyInfo = EFS_KEY_INFO;
  120. PEfsKeyInfo = PEFS_KEY_INFO;
  121. //
  122. // Input to add a user to an encrypted file
  123. //
  124. PENCRYPTION_CERTIFICATE = ^ENCRYPTION_CERTIFICATE;
  125. {$EXTERNALSYM PENCRYPTION_CERTIFICATE}
  126. _ENCRYPTION_CERTIFICATE = record
  127. cbTotalLength: DWORD;
  128. pUserSid: PSID;
  129. pCertBlob: PEFS_CERTIFICATE_BLOB;
  130. end;
  131. {$EXTERNALSYM _ENCRYPTION_CERTIFICATE}
  132. ENCRYPTION_CERTIFICATE = _ENCRYPTION_CERTIFICATE;
  133. {$EXTERNALSYM ENCRYPTION_CERTIFICATE}
  134. TEncryptionCertificate = ENCRYPTION_CERTIFICATE;
  135. PEncryptionCertificate = PENCRYPTION_CERTIFICATE;
  136. const
  137. MAX_SID_SIZE = 256;
  138. {$EXTERNALSYM MAX_SID_SIZE}
  139. type
  140. PENCRYPTION_CERTIFICATE_HASH = ^ENCRYPTION_CERTIFICATE_HASH;
  141. {$EXTERNALSYM PENCRYPTION_CERTIFICATE_HASH}
  142. _ENCRYPTION_CERTIFICATE_HASH = record
  143. cbTotalLength: DWORD;
  144. pUserSid: PSID;
  145. pHash: PEFS_HASH_BLOB;
  146. lpDisplayInformation: LPWSTR;
  147. end;
  148. {$EXTERNALSYM _ENCRYPTION_CERTIFICATE_HASH}
  149. ENCRYPTION_CERTIFICATE_HASH = _ENCRYPTION_CERTIFICATE_HASH;
  150. {$EXTERNALSYM ENCRYPTION_CERTIFICATE_HASH}
  151. TEncryptionCertificateHash = ENCRYPTION_CERTIFICATE_HASH;
  152. PEncryptionCertificateHash = PENCRYPTION_CERTIFICATE_HASH;
  153. PPENCRYPTION_CERTIFICATE_HASH = ^PENCRYPTION_CERTIFICATE_HASH;
  154. {$NODEFINE PPENCRYPTION_CERTIFICATE_HASH}
  155. PENCRYPTION_CERTIFICATE_HASH_LIST = ^ENCRYPTION_CERTIFICATE_HASH_LIST;
  156. {$EXTERNALSYM PENCRYPTION_CERTIFICATE_HASH_LIST}
  157. _ENCRYPTION_CERTIFICATE_HASH_LIST = record
  158. nCert_Hash: DWORD;
  159. pUsers: PPENCRYPTION_CERTIFICATE_HASH;
  160. end;
  161. {$EXTERNALSYM _ENCRYPTION_CERTIFICATE_HASH_LIST}
  162. ENCRYPTION_CERTIFICATE_HASH_LIST = _ENCRYPTION_CERTIFICATE_HASH_LIST;
  163. {$EXTERNALSYM ENCRYPTION_CERTIFICATE_HASH_LIST}
  164. TEncryptionCertificateHashList = ENCRYPTION_CERTIFICATE_HASH_LIST;
  165. PEncryptionCertificateHashList = PENCRYPTION_CERTIFICATE_HASH_LIST;
  166. PPENCRYPTION_CERTIFICATE = ^PENCRYPTION_CERTIFICATE;
  167. {$NODEFINE PPENCRYPTION_CERTIFICATE}
  168. PENCRYPTION_CERTIFICATE_LIST = ^ENCRYPTION_CERTIFICATE_LIST;
  169. {$EXTERNALSYM PENCRYPTION_CERTIFICATE_LIST}
  170. _ENCRYPTION_CERTIFICATE_LIST = record
  171. nUsers: DWORD;
  172. pUsers: PPENCRYPTION_CERTIFICATE;
  173. end;
  174. {$EXTERNALSYM _ENCRYPTION_CERTIFICATE_LIST}
  175. ENCRYPTION_CERTIFICATE_LIST = _ENCRYPTION_CERTIFICATE_LIST;
  176. {$EXTERNALSYM ENCRYPTION_CERTIFICATE_LIST}
  177. TEncryptionCertificateList = ENCRYPTION_CERTIFICATE_LIST;
  178. PEncryptionCertificateList = PENCRYPTION_CERTIFICATE_LIST;
  179. PPENCRYPTION_CERTIFICATE_HASH_LIST = ^PENCRYPTION_CERTIFICATE_HASH_LIST;
  180. {$NODEFINE PPENCRYPTION_CERTIFICATE_HASH_LIST}
  181. function QueryUsersOnEncryptedFile(lpFileName: LPCWSTR;
  182. var pUsers: PENCRYPTION_CERTIFICATE_HASH_LIST): DWORD; stdcall;
  183. {$EXTERNALSYM QueryUsersOnEncryptedFile}
  184. function QueryRecoveryAgentsOnEncryptedFile(lpFileName: LPCWSTR;
  185. var pRecoveryAgents: PENCRYPTION_CERTIFICATE_HASH_LIST): DWORD; stdcall;
  186. {$EXTERNALSYM QueryRecoveryAgentsOnEncryptedFile}
  187. function RemoveUsersFromEncryptedFile(lpFileName: LPCWSTR;
  188. pHashes: PENCRYPTION_CERTIFICATE_HASH_LIST): DWORD; stdcall;
  189. {$EXTERNALSYM RemoveUsersFromEncryptedFile}
  190. function AddUsersToEncryptedFile(lpFileName: LPCWSTR;
  191. pUsers: PENCRYPTION_CERTIFICATE_LIST): DWORD; stdcall;
  192. {$EXTERNALSYM AddUsersToEncryptedFile}
  193. function SetUserFileEncryptionKey(pEncryptionCertificate: PENCRYPTION_CERTIFICATE): DWORD; stdcall;
  194. {$EXTERNALSYM SetUserFileEncryptionKey}
  195. procedure FreeEncryptionCertificateHashList(pHashes: PENCRYPTION_CERTIFICATE_HASH_LIST); stdcall;
  196. {$EXTERNALSYM FreeEncryptionCertificateHashList}
  197. function EncryptionDisable(DirPath: LPCWSTR; Disable: BOOL): BOOL; stdcall;
  198. {$EXTERNALSYM EncryptionDisable}
  199. function DuplicateEncryptionInfoFile(SrcFileName, DstFileName: LPCWSTR; dwCreationDistribution,
  200. dwAttributes: DWORD; lpSecurityAttributes: LPSECURITY_ATTRIBUTES): DWORD; stdcall;
  201. {$EXTERNALSYM DuplicateEncryptionInfoFile}
  202. {$ENDIF JWA_INTERFACESECTION}
  203. {$IFNDEF JWA_INCLUDEMODE}
  204. implementation
  205. uses
  206. JwaWinDLLNames;
  207. {$ENDIF !JWA_INCLUDEMODE}
  208. {$IFDEF JWA_IMPLEMENTATIONSECTION}
  209. {$IFDEF DYNAMIC_LINK}
  210. var
  211. _QueryUsersOnEncryptedFile: Pointer;
  212. function QueryUsersOnEncryptedFile;
  213. begin
  214. GetProcedureAddress(_QueryUsersOnEncryptedFile, advapi32, 'QueryUsersOnEncryptedFile');
  215. asm
  216. MOV ESP, EBP
  217. POP EBP
  218. JMP [_QueryUsersOnEncryptedFile]
  219. end;
  220. end;
  221. var
  222. _QueryRecoveryAgentsOnEncrFile: Pointer;
  223. function QueryRecoveryAgentsOnEncryptedFile;
  224. begin
  225. GetProcedureAddress(_QueryRecoveryAgentsOnEncrFile, advapi32, 'QueryRecoveryAgentsOnEncryptedFile');
  226. asm
  227. MOV ESP, EBP
  228. POP EBP
  229. JMP [_QueryRecoveryAgentsOnEncrFile]
  230. end;
  231. end;
  232. var
  233. _RemoveUsersFromEncryptedFile: Pointer;
  234. function RemoveUsersFromEncryptedFile;
  235. begin
  236. GetProcedureAddress(_RemoveUsersFromEncryptedFile, advapi32, 'RemoveUsersFromEncryptedFile');
  237. asm
  238. MOV ESP, EBP
  239. POP EBP
  240. JMP [_RemoveUsersFromEncryptedFile]
  241. end;
  242. end;
  243. var
  244. _AddUsersToEncryptedFile: Pointer;
  245. function AddUsersToEncryptedFile;
  246. begin
  247. GetProcedureAddress(_AddUsersToEncryptedFile, advapi32, 'AddUsersToEncryptedFile');
  248. asm
  249. MOV ESP, EBP
  250. POP EBP
  251. JMP [_AddUsersToEncryptedFile]
  252. end;
  253. end;
  254. var
  255. _SetUserFileEncryptionKey: Pointer;
  256. function SetUserFileEncryptionKey;
  257. begin
  258. GetProcedureAddress(_SetUserFileEncryptionKey, advapi32, 'SetUserFileEncryptionKey');
  259. asm
  260. MOV ESP, EBP
  261. POP EBP
  262. JMP [_SetUserFileEncryptionKey]
  263. end;
  264. end;
  265. var
  266. _FreeEncrCertificateHashList: Pointer;
  267. procedure FreeEncryptionCertificateHashList;
  268. begin
  269. GetProcedureAddress(_FreeEncrCertificateHashList, advapi32, 'FreeEncryptionCertificateHashList');
  270. asm
  271. MOV ESP, EBP
  272. POP EBP
  273. JMP [_FreeEncrCertificateHashList]
  274. end;
  275. end;
  276. var
  277. _EncryptionDisable: Pointer;
  278. function EncryptionDisable;
  279. begin
  280. GetProcedureAddress(_EncryptionDisable, advapi32, 'EncryptionDisable');
  281. asm
  282. MOV ESP, EBP
  283. POP EBP
  284. JMP [_EncryptionDisable]
  285. end;
  286. end;
  287. var
  288. _DuplicateEncryptionInfoFile: Pointer;
  289. function DuplicateEncryptionInfoFile;
  290. begin
  291. GetProcedureAddress(_DuplicateEncryptionInfoFile, advapi32, 'DuplicateEncryptionInfoFile');
  292. asm
  293. MOV ESP, EBP
  294. POP EBP
  295. JMP [_DuplicateEncryptionInfoFile]
  296. end;
  297. end;
  298. {$ELSE}
  299. function QueryUsersOnEncryptedFile; external advapi32 name 'QueryUsersOnEncryptedFile';
  300. function QueryRecoveryAgentsOnEncryptedFile; external advapi32 name 'QueryRecoveryAgentsOnEncryptedFile';
  301. function RemoveUsersFromEncryptedFile; external advapi32 name 'RemoveUsersFromEncryptedFile';
  302. function AddUsersToEncryptedFile; external advapi32 name 'AddUsersToEncryptedFile';
  303. function SetUserFileEncryptionKey; external advapi32 name 'SetUserFileEncryptionKey';
  304. procedure FreeEncryptionCertificateHashList; external advapi32 name 'FreeEncryptionCertificateHashList';
  305. function EncryptionDisable; external advapi32 name 'EncryptionDisable';
  306. function DuplicateEncryptionInfoFile; external advapi32 name 'DuplicateEncryptionInfoFile';
  307. {$ENDIF DYNAMIC_LINK}
  308. {$ENDIF JWA_IMPLEMENTATIONSECTION}
  309. {$IFNDEF JWA_INCLUDEMODE}
  310. end.
  311. {$ENDIF !JWA_INCLUDEMODE}