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