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.
6 use ctypes::{c_int, c_void};
7 use shared::guiddef::REFIID;
8 use shared::minwindef::{BOOL, DWORD, UINT};
9 use shared::windef::HWND;
10 use um::minwinbase::SECURITY_ATTRIBUTES;
11 use um::shtypes::{PCIDLIST_ABSOLUTE, PCUITEMID_CHILD_ARRAY, PIDLIST_ABSOLUTE, REFKNOWNFOLDERID};
12 use um::winnt::{HANDLE, HRESULT, LPCSTR, LPCWSTR, LPSTR, LPWSTR, PCWSTR, PWSTR};
13 pub const IDO_SHGIOI_SHARE: c_int = 0x0FFFFFFF;
14 pub const IDO_SHGIOI_LINK: c_int = 0x0FFFFFFE;
15 // Yes, these values are supposed to be 9 digits
16 pub const IDO_SHGIOI_SLOWFILE: c_int = 0x0FFFFFFFD;
17 pub const IDO_SHGIOI_DEFAULT: c_int = 0x0FFFFFFFC;
18 extern "system" {
SHGetIconOverlayIndexA( pszIconPath: LPCSTR, iIconIndex: c_int, ) -> c_int19     pub fn SHGetIconOverlayIndexA(
20         pszIconPath: LPCSTR,
21         iIconIndex: c_int,
22     ) -> c_int;
SHGetIconOverlayIndexW( pszIconPath: LPCWSTR, iIconIndex: c_int, ) -> c_int23     pub fn SHGetIconOverlayIndexW(
24         pszIconPath: LPCWSTR,
25         iIconIndex: c_int,
26     ) -> c_int;
27 }
28 pub const GPFIDL_DEFAULT: GPFIDL_FLAGS = 0x0000;
29 pub const GPFIDL_ALTNAME: GPFIDL_FLAGS = 0x0001;
30 pub const GPFIDL_UNCPRINTER: GPFIDL_FLAGS = 0x0002;
31 pub type GPFIDL_FLAGS = c_int;
32 extern "system" {
SHGetPathFromIDListEx( pidl: PCIDLIST_ABSOLUTE, pszPath: PWSTR, cchPath: DWORD, uOpts: GPFIDL_FLAGS, ) -> BOOL33     pub fn SHGetPathFromIDListEx(
34         pidl: PCIDLIST_ABSOLUTE,
35         pszPath: PWSTR,
36         cchPath: DWORD,
37         uOpts: GPFIDL_FLAGS,
38     ) -> BOOL;
SHGetPathFromIDListA( pidl: PCIDLIST_ABSOLUTE, pszPath: LPSTR, ) -> BOOL39     pub fn SHGetPathFromIDListA(
40         pidl: PCIDLIST_ABSOLUTE,
41         pszPath: LPSTR,
42     ) -> BOOL;
SHGetPathFromIDListW( pidl: PCIDLIST_ABSOLUTE, pszPath: LPWSTR, ) -> BOOL43     pub fn SHGetPathFromIDListW(
44         pidl: PCIDLIST_ABSOLUTE,
45         pszPath: LPWSTR,
46     ) -> BOOL;
SHCreateDirectory( hwnd: HWND, pszPath: PCWSTR, ) -> c_int47     pub fn SHCreateDirectory(
48         hwnd: HWND,
49         pszPath: PCWSTR,
50     ) -> c_int;
SHCreateDirectoryExA( hwnd: HWND, pszPath: LPCSTR, psa: *const SECURITY_ATTRIBUTES, ) -> c_int51     pub fn SHCreateDirectoryExA(
52         hwnd: HWND,
53         pszPath: LPCSTR,
54         psa: *const SECURITY_ATTRIBUTES,
55     ) -> c_int;
SHCreateDirectoryExW( hwnd: HWND, pszPath: LPCWSTR, psa: *const SECURITY_ATTRIBUTES, ) -> c_int56     pub fn SHCreateDirectoryExW(
57         hwnd: HWND,
58         pszPath: LPCWSTR,
59         psa: *const SECURITY_ATTRIBUTES,
60     ) -> c_int;
61 }
62 pub const OFASI_EDIT: DWORD = 0x0001;
63 pub const OFASI_OPENDESKTOP: DWORD = 0x0002;
64 extern "system" {
SHOpenFolderAndSelectItems( pidlFolder: PCIDLIST_ABSOLUTE, cidl: UINT, apidl: PCUITEMID_CHILD_ARRAY, dwFlags: DWORD, ) -> HRESULT65     pub fn SHOpenFolderAndSelectItems(
66         pidlFolder: PCIDLIST_ABSOLUTE,
67         cidl: UINT,
68         apidl: PCUITEMID_CHILD_ARRAY,
69         dwFlags: DWORD,
70     ) -> HRESULT;
71     //pub fn SHCreateShellItem(
72     //    pidlParent: PCIDLIST_ABSOLUTE,
73     //    psfParent: *mut IShellFolder,
74     //    pidl: PCUITEMID_CHILD,
75     //    ppsi: *mut *mut IShellItem,
76     //) -> HRESULT;
77 }
78 pub const CSIDL_DESKTOP: c_int = 0x0000;
79 pub const CSIDL_INTERNET: c_int = 0x0001;
80 pub const CSIDL_PROGRAMS: c_int = 0x0002;
81 pub const CSIDL_CONTROLS: c_int = 0x0003;
82 pub const CSIDL_PRINTERS: c_int = 0x0004;
83 pub const CSIDL_PERSONAL: c_int = 0x0005;
84 pub const CSIDL_FAVORITES: c_int = 0x0006;
85 pub const CSIDL_STARTUP: c_int = 0x0007;
86 pub const CSIDL_RECENT: c_int = 0x0008;
87 pub const CSIDL_SENDTO: c_int = 0x0009;
88 pub const CSIDL_BITBUCKET: c_int = 0x000a;
89 pub const CSIDL_STARTMENU: c_int = 0x000b;
90 pub const CSIDL_MYDOCUMENTS: c_int = CSIDL_PERSONAL;
91 pub const CSIDL_MYMUSIC: c_int = 0x000d;
92 pub const CSIDL_MYVIDEO: c_int = 0x000e;
93 pub const CSIDL_DESKTOPDIRECTORY: c_int = 0x0010;
94 pub const CSIDL_DRIVES: c_int = 0x0011;
95 pub const CSIDL_NETWORK: c_int = 0x0012;
96 pub const CSIDL_NETHOOD: c_int = 0x0013;
97 pub const CSIDL_FONTS: c_int = 0x0014;
98 pub const CSIDL_TEMPLATES: c_int = 0x0015;
99 pub const CSIDL_COMMON_STARTMENU: c_int = 0x0016;
100 pub const CSIDL_COMMON_PROGRAMS: c_int = 0x0017;
101 pub const CSIDL_COMMON_STARTUP: c_int = 0x0018;
102 pub const CSIDL_COMMON_DESKTOPDIRECTORY: c_int = 0x0019;
103 pub const CSIDL_APPDATA: c_int = 0x001a;
104 pub const CSIDL_PRINTHOOD: c_int = 0x001b;
105 pub const CSIDL_LOCAL_APPDATA: c_int = 0x001c;
106 pub const CSIDL_ALTSTARTUP: c_int = 0x001d;
107 pub const CSIDL_COMMON_ALTSTARTUP: c_int = 0x001e;
108 pub const CSIDL_COMMON_FAVORITES: c_int = 0x001f;
109 pub const CSIDL_INTERNET_CACHE: c_int = 0x0020;
110 pub const CSIDL_COOKIES: c_int = 0x0021;
111 pub const CSIDL_HISTORY: c_int = 0x0022;
112 pub const CSIDL_COMMON_APPDATA: c_int = 0x0023;
113 pub const CSIDL_WINDOWS: c_int = 0x0024;
114 pub const CSIDL_SYSTEM: c_int = 0x0025;
115 pub const CSIDL_PROGRAM_FILES: c_int = 0x0026;
116 pub const CSIDL_MYPICTURES: c_int = 0x0027;
117 pub const CSIDL_PROFILE: c_int = 0x0028;
118 pub const CSIDL_SYSTEMX86: c_int = 0x0029;
119 pub const CSIDL_PROGRAM_FILESX86: c_int = 0x002a;
120 pub const CSIDL_PROGRAM_FILES_COMMON: c_int = 0x002b;
121 pub const CSIDL_PROGRAM_FILES_COMMONX86: c_int = 0x002c;
122 pub const CSIDL_COMMON_TEMPLATES: c_int = 0x002d;
123 pub const CSIDL_COMMON_DOCUMENTS: c_int = 0x002e;
124 pub const CSIDL_COMMON_ADMINTOOLS: c_int = 0x002f;
125 pub const CSIDL_ADMINTOOLS: c_int = 0x0030;
126 pub const CSIDL_CONNECTIONS: c_int = 0x0031;
127 pub const CSIDL_COMMON_MUSIC: c_int = 0x0035;
128 pub const CSIDL_COMMON_PICTURES: c_int = 0x0036;
129 pub const CSIDL_COMMON_VIDEO: c_int = 0x0037;
130 pub const CSIDL_RESOURCES: c_int = 0x0038;
131 pub const CSIDL_RESOURCES_LOCALIZED: c_int = 0x0039;
132 pub const CSIDL_COMMON_OEM_LINKS: c_int = 0x003a;
133 pub const CSIDL_CDBURN_AREA: c_int = 0x003b;
134 pub const CSIDL_COMPUTERSNEARME: c_int = 0x003d;
135 pub const CSIDL_FLAG_CREATE: c_int = 0x8000;
136 pub const CSIDL_FLAG_DONT_VERIFY: c_int = 0x4000;
137 pub const CSIDL_FLAG_DONT_UNEXPAND: c_int = 0x2000;
138 pub const CSIDL_FLAG_NO_ALIAS: c_int = 0x1000;
139 pub const CSIDL_FLAG_PER_USER_INIT: c_int = 0x0800;
140 pub const CSIDL_FLAG_MASK: c_int = 0xff00;
141 extern "system" {
SHGetSpecialFolderLocation( hwnd: HWND, csidl: c_int, ppidl: *mut PIDLIST_ABSOLUTE, ) -> HRESULT142     pub fn SHGetSpecialFolderLocation(
143         hwnd: HWND,
144         csidl: c_int,
145         ppidl: *mut PIDLIST_ABSOLUTE,
146     ) -> HRESULT;
SHCloneSpecialIDList( hwnd: HWND, csidl: c_int, fCreate: BOOL, ) -> PIDLIST_ABSOLUTE147     pub fn SHCloneSpecialIDList(
148         hwnd: HWND,
149         csidl: c_int,
150         fCreate: BOOL,
151     ) -> PIDLIST_ABSOLUTE;
SHGetSpecialFolderPathA( hwnd: HWND, pszPath: LPSTR, csidl: c_int, fCreate: BOOL, ) -> BOOL152     pub fn SHGetSpecialFolderPathA(
153         hwnd: HWND,
154         pszPath: LPSTR,
155         csidl: c_int,
156         fCreate: BOOL,
157     ) -> BOOL;
SHGetSpecialFolderPathW( hwnd: HWND, pszPath: LPWSTR, csidl: c_int, fCreate: BOOL, ) -> BOOL158     pub fn SHGetSpecialFolderPathW(
159         hwnd: HWND,
160         pszPath: LPWSTR,
161         csidl: c_int,
162         fCreate: BOOL,
163     ) -> BOOL;
SHFlushSFCache()164     pub fn SHFlushSFCache();
165 }
166 ENUM!{enum SHGFP_TYPE {
167     SHGFP_TYPE_CURRENT = 0,
168     SHGFP_TYPE_DEFAULT = 1,
169 }}
170 extern "system" {
SHGetFolderPathA( hwnd: HWND, csidl: c_int, hToken: HANDLE, dwFlags: DWORD, pszPath: LPSTR, ) -> HRESULT171     pub fn SHGetFolderPathA(
172         hwnd: HWND,
173         csidl: c_int,
174         hToken: HANDLE,
175         dwFlags: DWORD,
176         pszPath: LPSTR,
177     ) -> HRESULT;
SHGetFolderPathW( hwnd: HWND, csidl: c_int, hToken: HANDLE, dwFlags: DWORD, pszPath: LPWSTR, ) -> HRESULT178     pub fn SHGetFolderPathW(
179         hwnd: HWND,
180         csidl: c_int,
181         hToken: HANDLE,
182         dwFlags: DWORD,
183         pszPath: LPWSTR,
184     ) -> HRESULT;
SHGetFolderLocation( hwnd: HWND, csidl: c_int, hToken: HANDLE, dwFlags: DWORD, ppidl: *mut PIDLIST_ABSOLUTE, ) -> HRESULT185     pub fn SHGetFolderLocation(
186         hwnd: HWND,
187         csidl: c_int,
188         hToken: HANDLE,
189         dwFlags: DWORD,
190         ppidl: *mut PIDLIST_ABSOLUTE,
191     ) -> HRESULT;
SHSetFolderPathA( csidl: c_int, hToken: HANDLE, dwFlags: DWORD, pszPath: LPCSTR, ) -> HRESULT192     pub fn SHSetFolderPathA(
193         csidl: c_int,
194         hToken: HANDLE,
195         dwFlags: DWORD,
196         pszPath: LPCSTR,
197     ) -> HRESULT;
SHSetFolderPathW( csidl: c_int, hToken: HANDLE, dwFlags: DWORD, pszPath: LPCWSTR, ) -> HRESULT198     pub fn SHSetFolderPathW(
199         csidl: c_int,
200         hToken: HANDLE,
201         dwFlags: DWORD,
202         pszPath: LPCWSTR,
203     ) -> HRESULT;
SHGetFolderPathAndSubDirA( hwnd: HWND, csidl: c_int, hToken: HANDLE, dwFlags: DWORD, pszSubDir: LPCSTR, pszPath: LPSTR, ) -> HRESULT204     pub fn SHGetFolderPathAndSubDirA(
205         hwnd: HWND,
206         csidl: c_int,
207         hToken: HANDLE,
208         dwFlags: DWORD,
209         pszSubDir: LPCSTR,
210         pszPath: LPSTR,
211     ) -> HRESULT;
SHGetFolderPathAndSubDirW( hwnd: HWND, csidl: c_int, hToken: HANDLE, dwFlags: DWORD, pszSubDir: LPCWSTR, pszPath: LPWSTR, ) -> HRESULT212     pub fn SHGetFolderPathAndSubDirW(
213         hwnd: HWND,
214         csidl: c_int,
215         hToken: HANDLE,
216         dwFlags: DWORD,
217         pszSubDir: LPCWSTR,
218         pszPath: LPWSTR,
219     ) -> HRESULT;
220 }
221 ENUM!{enum KNOWN_FOLDER_FLAG {
222     KF_FLAG_DEFAULT = 0x00000000,
223     KF_FLAG_NO_APPCONTAINER_REDIRECTION = 0x00010000,
224     KF_FLAG_CREATE = 0x00008000,
225     KF_FLAG_DONT_VERIFY = 0x00004000,
226     KF_FLAG_DONT_UNEXPAND = 0x00002000,
227     KF_FLAG_NO_ALIAS = 0x00001000,
228     KF_FLAG_INIT = 0x00000800,
229     KF_FLAG_DEFAULT_PATH = 0x00000400,
230     KF_FLAG_NOT_PARENT_RELATIVE = 0x00000200,
231     KF_FLAG_SIMPLE_IDLIST = 0x00000100,
232     KF_FLAG_ALIAS_ONLY = 0x80000000,
233 }}
234 extern "system" {
SHGetKnownFolderIDList( rfid: REFKNOWNFOLDERID, dwFlags: DWORD, hToken: HANDLE, ppidl: *mut PIDLIST_ABSOLUTE, ) -> HRESULT235     pub fn SHGetKnownFolderIDList(
236         rfid: REFKNOWNFOLDERID,
237         dwFlags: DWORD,
238         hToken: HANDLE,
239         ppidl: *mut PIDLIST_ABSOLUTE,
240     ) -> HRESULT;
SHSetKnownFolderPath( rfid: REFKNOWNFOLDERID, dwFlags: DWORD, hToken: HANDLE, pszPath: PCWSTR, ) -> HRESULT241     pub fn SHSetKnownFolderPath(
242         rfid: REFKNOWNFOLDERID,
243         dwFlags: DWORD,
244         hToken: HANDLE,
245         pszPath: PCWSTR,
246     ) -> HRESULT;
SHGetKnownFolderPath( rfid: REFKNOWNFOLDERID, dwFlags: DWORD, hToken: HANDLE, pszPath: *mut PWSTR, ) -> HRESULT247     pub fn SHGetKnownFolderPath(
248         rfid: REFKNOWNFOLDERID,
249         dwFlags: DWORD,
250         hToken: HANDLE,
251         pszPath: *mut PWSTR,
252     ) -> HRESULT;
SHGetKnownFolderItem( rfid: REFKNOWNFOLDERID, flags: KNOWN_FOLDER_FLAG, hToken: HANDLE, riid: REFIID, ppv: *mut *mut c_void, ) -> HRESULT253     pub fn SHGetKnownFolderItem(
254         rfid: REFKNOWNFOLDERID,
255         flags: KNOWN_FOLDER_FLAG,
256         hToken: HANDLE,
257         riid: REFIID,
258         ppv: *mut *mut c_void,
259     ) -> HRESULT;
260 }
261