jwawinefs.pas 12 KB

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