winapi_ui_automation/um/
winefs.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6use shared::basetsd::SIZE_T;
7use shared::minwindef::{BOOL, DWORD, LPVOID, PBYTE, PDWORD, ULONG};
8use um::minwinbase::SECURITY_ATTRIBUTES;
9use um::wincrypt::ALG_ID;
10use um::winnt::{LPCWSTR, LPWSTR, SID};
11pub const WINEFS_SETUSERKEY_SET_CAPABILITIES: DWORD = 0x00000001;
12STRUCT!{struct EFS_CERTIFICATE_BLOB {
13    dwCertEncodingType: DWORD,
14    cbData: DWORD,
15    pbData: PBYTE,
16}}
17pub type PEFS_CERTIFICATE_BLOB = *mut EFS_CERTIFICATE_BLOB;
18STRUCT!{struct EFS_HASH_BLOB {
19    cbData: DWORD,
20    pbData: PBYTE,
21}}
22pub type PEFS_HASH_BLOB = *mut EFS_HASH_BLOB;
23STRUCT!{struct EFS_RPC_BLOB {
24    cbData: DWORD,
25    pbData: PBYTE,
26}}
27pub type PEFS_RPC_BLOB = *mut EFS_RPC_BLOB;
28STRUCT!{struct EFS_PIN_BLOB {
29    cbPadding: DWORD,
30    cbData: DWORD,
31    pbData: PBYTE,
32}}
33pub type PEFS_PIN_BLOB = *mut EFS_PIN_BLOB;
34STRUCT!{struct EFS_KEY_INFO {
35    dwVersion: DWORD,
36    Entropy: ULONG,
37    Algorithm: ALG_ID,
38    KeyLength: ULONG,
39}}
40pub type PEFS_KEY_INFO = *mut EFS_KEY_INFO;
41STRUCT!{struct EFS_COMPATIBILITY_INFO {
42    EfsVersion: DWORD,
43}}
44pub type PEFS_COMPATIBILITY_INFO = *mut EFS_COMPATIBILITY_INFO;
45pub const EFS_COMPATIBILITY_VERSION_NCRYPT_PROTECTOR: DWORD = 5;
46pub const EFS_COMPATIBILITY_VERSION_PFILE_PROTECTOR: DWORD = 6;
47#[inline]
48pub fn EFS_IS_DESCRIPTOR_VERSION(v: DWORD) -> bool {
49    v == EFS_COMPATIBILITY_VERSION_NCRYPT_PROTECTOR
50        || v == EFS_COMPATIBILITY_VERSION_PFILE_PROTECTOR
51}
52pub const EFS_SUBVER_UNKNOWN: DWORD = 0;
53pub const EFS_EFS_SUBVER_EFS_CERT: DWORD = 1;
54pub const EFS_PFILE_SUBVER_RMS: DWORD = 2;
55pub const EFS_PFILE_SUBVER_APPX: DWORD = 3;
56STRUCT!{struct EFS_VERSION_INFO {
57    EfsVersion: DWORD,
58    SubVersion: DWORD,
59}}
60pub type PEFS_VERSION_INFO = *mut EFS_VERSION_INFO;
61#[inline]
62pub fn EFS_IS_APPX_VERSION(v: DWORD, subV: DWORD) -> bool {
63    v == EFS_COMPATIBILITY_VERSION_PFILE_PROTECTOR && subV == EFS_PFILE_SUBVER_APPX
64}
65STRUCT!{struct EFS_DECRYPTION_STATUS_INFO {
66    dwDecryptionError: DWORD,
67    dwHashOffset: DWORD,
68    cbHash: DWORD,
69}}
70pub type PEFS_DECRYPTION_STATUS_INFO = *mut EFS_DECRYPTION_STATUS_INFO;
71STRUCT!{struct EFS_ENCRYPTION_STATUS_INFO {
72    bHasCurrentKey: BOOL,
73    dwEncryptionError: DWORD,
74}}
75pub type PEFS_ENCRYPTION_STATUS_INFO = *mut EFS_ENCRYPTION_STATUS_INFO;
76STRUCT!{struct ENCRYPTION_CERTIFICATE {
77    cbTotalLength: DWORD,
78    pUserSid: *mut SID,
79    pCertBlob: PEFS_CERTIFICATE_BLOB,
80}}
81pub type PENCRYPTION_CERTIFICATE = *mut ENCRYPTION_CERTIFICATE;
82pub const MAX_SID_SIZE: SIZE_T = 256;
83STRUCT!{struct ENCRYPTION_CERTIFICATE_HASH {
84    cbTotalLength: DWORD,
85    pUserSid: *mut SID,
86    pHash: PEFS_HASH_BLOB,
87    lpDisplayInformation: LPWSTR,
88}}
89pub type PENCRYPTION_CERTIFICATE_HASH = *mut ENCRYPTION_CERTIFICATE_HASH;
90STRUCT!{struct ENCRYPTION_CERTIFICATE_HASH_LIST {
91    nCert_Hash: DWORD,
92    pUsers: *mut PENCRYPTION_CERTIFICATE_HASH,
93}}
94pub type PENCRYPTION_CERTIFICATE_HASH_LIST = *mut ENCRYPTION_CERTIFICATE_HASH_LIST;
95STRUCT!{struct ENCRYPTION_CERTIFICATE_LIST {
96    nUsers: DWORD,
97    pUsers: *mut PENCRYPTION_CERTIFICATE,
98}}
99pub type PENCRYPTION_CERTIFICATE_LIST = *mut ENCRYPTION_CERTIFICATE_LIST;
100pub const EFS_METADATA_ADD_USER: DWORD = 0x00000001;
101pub const EFS_METADATA_REMOVE_USER: DWORD = 0x00000002;
102pub const EFS_METADATA_REPLACE_USER: DWORD = 0x00000004;
103pub const EFS_METADATA_GENERAL_OP: DWORD = 0x00000008;
104STRUCT!{struct ENCRYPTED_FILE_METADATA_SIGNATURE {
105    dwEfsAccessType: DWORD,
106    pCertificatesAdded: PENCRYPTION_CERTIFICATE_HASH_LIST,
107    pEncryptionCertificate: PENCRYPTION_CERTIFICATE,
108    pEfsStreamSignature: PEFS_RPC_BLOB,
109}}
110pub type PENCRYPTED_FILE_METADATA_SIGNATURE = *mut ENCRYPTED_FILE_METADATA_SIGNATURE;
111STRUCT!{struct ENCRYPTION_PROTECTOR {
112    cbTotalLength: DWORD,
113    pUserSid: *mut SID,
114    lpProtectorDescriptor: LPWSTR,
115}}
116pub type PENCRYPTION_PROTECTOR = *mut ENCRYPTION_PROTECTOR;
117STRUCT!{struct ENCRYPTION_PROTECTOR_LIST {
118    nProtectors: DWORD,
119    pProtectors: *mut PENCRYPTION_PROTECTOR,
120}}
121pub type PENCRYPTION_PROTECTOR_LIST = *mut ENCRYPTION_PROTECTOR_LIST;
122extern "system" {
123    pub fn QueryUsersOnEncryptedFile(
124        lpFileName: LPCWSTR,
125        pUsers: *mut PENCRYPTION_CERTIFICATE_HASH_LIST,
126    ) -> DWORD;
127    pub fn QueryRecoveryAgentsOnEncryptedFile(
128        lpFileName: LPCWSTR,
129        pRecoveryAgents: *mut PENCRYPTION_CERTIFICATE_HASH_LIST,
130    ) -> DWORD;
131    pub fn RemoveUsersFromEncryptedFile(
132        lpFileName: LPCWSTR,
133        pHashes: PENCRYPTION_CERTIFICATE_HASH_LIST,
134    ) -> DWORD;
135    pub fn AddUsersToEncryptedFile(
136        lpFileName: LPCWSTR,
137        pEncryptionCertificate: PENCRYPTION_CERTIFICATE_LIST,
138    ) -> DWORD;
139    pub fn SetUserFileEncryptionKey(
140        pEncryptionCertificate: PENCRYPTION_CERTIFICATE,
141    ) -> DWORD;
142    pub fn SetUserFileEncryptionKeyEx(
143        pEncryptionCertificate: PENCRYPTION_CERTIFICATE,
144        dwCapabilities: DWORD,
145        dwFlags: DWORD,
146        pvReserved: LPVOID,
147    ) -> DWORD;
148    pub fn FreeEncryptionCertificateHashList(
149        pUsers: PENCRYPTION_CERTIFICATE_HASH_LIST,
150    );
151    pub fn EncryptionDisable(
152        DirPath: LPCWSTR,
153        Disable: BOOL,
154    ) -> BOOL;
155    pub fn DuplicateEncryptionInfoFile(
156        SrcFileName: LPCWSTR,
157        DstFileName: LPCWSTR,
158        dwCreationDistribution: DWORD,
159        dwAttributes: DWORD,
160        lpSecurityAttributes: *const SECURITY_ATTRIBUTES,
161    ) -> DWORD;
162    pub fn GetEncryptedFileMetadata(
163        lpFileName: LPCWSTR,
164        pcbMetadata: PDWORD,
165        ppbMetadata: *mut PBYTE,
166    ) -> DWORD;
167    pub fn SetEncryptedFileMetadata(
168        lpFileName: LPCWSTR,
169        pbOldMetadata: PBYTE,
170        pbNewMetadata: PBYTE,
171        pOwnerHash: PENCRYPTION_CERTIFICATE_HASH,
172        dwOperation: DWORD,
173        pCertificatesAdded: PENCRYPTION_CERTIFICATE_HASH_LIST,
174    ) -> DWORD;
175    pub fn FreeEncryptedFileMetadata(
176        pbMetadata: PBYTE,
177    );
178}