jwawinefs.pas 12 KB

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