// Licensed under the Apache License, Version 2.0 // or the MIT license // , at your option. // All files in the project carrying such notice may not be copied, modified, or distributed // except according to those terms //! SHELL.DLL functions, types, and definitions use ctypes::{__int64, c_int, c_void}; use shared::basetsd::{DWORD_PTR, UINT_PTR}; use shared::guiddef::{GUID, REFIID}; use shared::minwindef::{ BOOL, DWORD, FILETIME, HINSTANCE, HKEY, INT, LPARAM, LPVOID, MAX_PATH, UINT, ULONG, WORD, }; use shared::windef::{HICON, HWND, POINT, RECT}; use um::minwinbase::LPSECURITY_ATTRIBUTES; use um::processthreadsapi::{LPPROCESS_INFORMATION, LPSTARTUPINFOW}; use um::winnt::{ CHAR, HANDLE, HRESULT, LPCSTR, LPCWSTR, LPSTR, LPWSTR, PCSTR, PCWSTR, PCZZSTR, PCZZWSTR, PWSTR, PZZSTR, PZZWSTR, ULARGE_INTEGER, WCHAR, }; use um::winuser::WM_USER; DECLARE_HANDLE!{HDROP, HDROP__} extern "system" { pub fn DragQueryFileA( hDrop: HDROP, iFile: UINT, lpszFile: LPSTR, cch: UINT, ) -> UINT; pub fn DragQueryFileW( hDrop: HDROP, iFile: UINT, lpszFile: LPWSTR, cch: UINT, ) -> UINT; pub fn DragQueryPoint( hDrop: HDROP, lppt: *mut POINT, ) -> BOOL; pub fn DragFinish( hDrop: HDROP, ); pub fn DragAcceptFiles( hWnd: HWND, fAccept: BOOL, ); pub fn ShellExecuteA( hwnd: HWND, lpOperation: LPCSTR, lpFile: LPCSTR, lpParameters: LPCSTR, lpDirectory: LPCSTR, nShowCmd: c_int, ) -> HINSTANCE; pub fn ShellExecuteW( hwnd: HWND, lpOperation: LPCWSTR, lpFile: LPCWSTR, lpParameters: LPCWSTR, lpDirectory: LPCWSTR, nShowCmd: c_int, ) -> HINSTANCE; pub fn FindExecutableA( lpFile: LPCSTR, lpDirectory: LPCSTR, lpResult: LPSTR, ) -> HINSTANCE; pub fn FindExecutableW( lpFile: LPCWSTR, lpDirectory: LPCWSTR, lpResult: LPWSTR, ) -> HINSTANCE; pub fn CommandLineToArgvW( lpCmdLine: LPCWSTR, pNumArgs: *mut c_int, ) -> *mut LPWSTR; pub fn ShellAboutA( hWnd: HWND, szApp: LPCSTR, szOtherStuff: LPCSTR, hIcon: HICON, ) -> INT; pub fn ShellAboutW( hWnd: HWND, szApp: LPCWSTR, szOtherStuff: LPCWSTR, hIcon: HICON, ) -> INT; pub fn DuplicateIcon( hInst: HINSTANCE, hIcon: HICON, ) -> HICON; pub fn ExtractAssociatedIconA( hInst: HINSTANCE, pszIconPath: LPSTR, piIcon: *mut WORD, ) -> HICON; pub fn ExtractAssociatedIconW( hInst: HINSTANCE, pszIconPath: LPWSTR, piIcon: *mut WORD, ) -> HICON; pub fn ExtractAssociatedIconExA( hInst: HINSTANCE, pszIconPath: LPSTR, piIconIndex: *mut WORD, piIconId: *mut WORD, ) -> HICON; pub fn ExtractAssociatedIconExW( hInst: HINSTANCE, pszIconPath: LPWSTR, piIconIndex: *mut WORD, piIconId: *mut WORD, ) -> HICON; pub fn ExtractIconA( hInst: HINSTANCE, pszExeFileName: LPCSTR, nIconIndex: UINT, ) -> HICON; pub fn ExtractIconW( hInst: HINSTANCE, pszExeFileName: LPCWSTR, nIconIndex: UINT, ) -> HICON; } STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct DRAGINFOA { uSize: UINT, pt: POINT, fNC: BOOL, lpFileList: PZZSTR, grfKeyState: DWORD, }} pub type LPDRAGINFOA = *mut DRAGINFOA; STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct DRAGINFOW { uSize: UINT, pt: POINT, fNC: BOOL, lpFileList: PZZWSTR, grfKeyState: DWORD, }} pub type LPDRAGINFOW = *mut DRAGINFOW; pub const ABM_NEW: DWORD = 0x00000000; pub const ABM_REMOVE: DWORD = 0x00000001; pub const ABM_QUERYPOS: DWORD = 0x00000002; pub const ABM_SETPOS: DWORD = 0x00000003; pub const ABM_GETSTATE: DWORD = 0x00000004; pub const ABM_GETTASKBARPOS: DWORD = 0x00000005; pub const ABM_ACTIVATE: DWORD = 0x00000006; pub const ABM_GETAUTOHIDEBAR: DWORD = 0x00000007; pub const ABM_SETAUTOHIDEBAR: DWORD = 0x00000008; pub const ABM_WINDOWPOSCHANGED: DWORD = 0x0000009; pub const ABM_SETSTATE: DWORD = 0x0000000a; pub const ABM_GETAUTOHIDEBAREX: DWORD = 0x0000000b; pub const ABM_SETAUTOHIDEBAREX: DWORD = 0x0000000c; pub const ABN_STATECHANGE: DWORD = 0x0000000; pub const ABN_POSCHANGED: DWORD = 0x0000001; pub const ABN_FULLSCREENAPP: DWORD = 0x0000002; pub const ABN_WINDOWARRANGE: DWORD = 0x0000003; pub const ABS_AUTOHIDE: UINT = 0x0000001; pub const ABS_ALWAYSONTOP: UINT = 0x0000002; pub const ABE_LEFT: UINT = 0; pub const ABE_TOP: UINT = 1; pub const ABE_RIGHT: UINT = 2; pub const ABE_BOTTOM: UINT = 3; STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct APPBARDATA { cbSize: DWORD, hWnd: HWND, uCallbackMessage: UINT, uEdge: UINT, rc: RECT, lParam: LPARAM, }} pub type PAPPBARDATA = *mut APPBARDATA; extern "system" { pub fn SHAppBarMessage( dwMessage: DWORD, pData: PAPPBARDATA, ) -> UINT_PTR; pub fn DoEnvironmentSubstA( pszSrc: LPSTR, cchSrc: UINT, ) -> DWORD; pub fn DoEnvironmentSubstW( pszSrc: LPWSTR, cchSrc: UINT, ) -> DWORD; pub fn ExtractIconExA( lpszFile: LPCSTR, nIconIndex: c_int, phiconLarge: *mut HICON, phiconSmall: *mut HICON, nIcons: UINT, ) -> UINT; pub fn ExtractIconExW( lpszFile: LPCWSTR, nIconIndex: c_int, phiconLarge: *mut HICON, phiconSmall: *mut HICON, nIcons: UINT, ) -> UINT; } pub const FO_MOVE: WORD = 0x0001; pub const FO_COPY: WORD = 0x0002; pub const FO_DELETE: WORD = 0x0003; pub const FO_RENAME: WORD = 0x0004; pub const FOF_MULTIDESTFILES: WORD = 0x0001; pub const FOF_CONFIRMMOUSE: WORD = 0x0002; pub const FOF_SILENT: WORD = 0x0004; pub const FOF_RENAMEONCOLLISION: WORD = 0x0008; pub const FOF_NOCONFIRMATION: WORD = 0x0010; pub const FOF_WANTMAPPINGHANDLE: WORD = 0x0020; pub const FOF_ALLOWUNDO: WORD = 0x0040; pub const FOF_FILESONLY: WORD = 0x0080; pub const FOF_SIMPLEPROGRESS: WORD = 0x0100; pub const FOF_NOCONFIRMMKDIR: WORD = 0x0200; pub const FOF_NOERRORUI: WORD = 0x0400; pub const FOF_NOCOPYSECURITYATTRIBS: WORD = 0x0800; pub const FOF_NORECURSION: WORD = 0x1000; pub const FOF_NO_CONNECTED_ELEMENTS: WORD = 0x2000; pub const FOF_WANTNUKEWARNING: WORD = 0x4000; pub const FOF_NORECURSEREPARSE: WORD = 0x8000; pub const FOF_NO_UI: WORD = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR; pub type FILEOP_FLAGS = WORD; pub const PO_DELETE: WORD = 0x0013; pub const PO_RENAME: WORD = 0x0014; pub const PO_PORTCHANGE: WORD = 0x0020; pub const PO_REN_PORT: WORD = 0x0034; pub type PRINTEROP_FLAGS = WORD; STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct SHFILEOPSTRUCTA { hwnd: HWND, wFunc: UINT, pFrom: PCZZSTR, pTo: PCZZSTR, fFlags: FILEOP_FLAGS, fAnyOperationsAborted: BOOL, hNameMappings: LPVOID, lpszProgressTitle: PCSTR, }} pub type LPSHFILEOPSTRUCTA = *mut SHFILEOPSTRUCTA; STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct SHFILEOPSTRUCTW { hwnd: HWND, wFunc: UINT, pFrom: PCZZWSTR, pTo: PCZZWSTR, fFlags: FILEOP_FLAGS, fAnyOperationsAborted: BOOL, hNameMappings: LPVOID, lpszProgressTitle: PCWSTR, }} pub type LPSHFILEOPSTRUCTW = *mut SHFILEOPSTRUCTW; extern "system" { pub fn SHFileOperationA( lpFileOp: LPSHFILEOPSTRUCTA, ) -> c_int; pub fn SHFileOperationW( lpFileOp: LPSHFILEOPSTRUCTW, ) -> c_int; pub fn SHFreeNameMappings( hNameMappings: HANDLE, ); } STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct SHNAMEMAPPINGA { pszOldPath: LPSTR, pszNewPath: LPSTR, cchOldPath: c_int, cchNewPath: c_int, }} pub type LPSHNAMEMAPPINGA = *mut SHNAMEMAPPINGA; STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct SHNAMEMAPPINGW { pszOldPath: LPWSTR, pszNewPath: LPWSTR, cchOldPath: c_int, cchNewPath: c_int, }} pub type LPSHNAMEMAPPINGW = *mut SHNAMEMAPPINGW; pub const SE_ERR_FNF: DWORD = 2; pub const SE_ERR_PNF: DWORD = 3; pub const SE_ERR_ACCESSDENIED: DWORD = 5; pub const SE_ERR_OOM: DWORD = 8; pub const SE_ERR_DLLNOTFOUND: DWORD = 32; pub const SE_ERR_SHARE: DWORD = 26; pub const SE_ERR_ASSOCINCOMPLETE: DWORD = 27; pub const SE_ERR_DDETIMEOUT: DWORD = 28; pub const SE_ERR_DDEFAIL: DWORD = 29; pub const SE_ERR_DDEBUSY: DWORD = 30; pub const SE_ERR_NOASSOC: DWORD = 31; pub const SEE_MASK_DEFAULT: DWORD = 0x00000000; pub const SEE_MASK_CLASSNAME: DWORD = 0x00000001; pub const SEE_MASK_CLASSKEY: DWORD = 0x00000003; pub const SEE_MASK_IDLIST: DWORD = 0x00000004; pub const SEE_MASK_INVOKEIDLIST: DWORD = 0x0000000c; pub const SEE_MASK_ICON: DWORD = 0x00000010; pub const SEE_MASK_HOTKEY: DWORD = 0x00000020; pub const SEE_MASK_NOCLOSEPROCESS: DWORD = 0x00000040; pub const SEE_MASK_CONNECTNETDRV: DWORD = 0x00000080; pub const SEE_MASK_NOASYNC: DWORD = 0x00000100; pub const SEE_MASK_FLAG_DDEWAIT: DWORD = SEE_MASK_NOASYNC; pub const SEE_MASK_DOENVSUBST: DWORD = 0x00000200; pub const SEE_MASK_FLAG_NO_UI: DWORD = 0x00000400; pub const SEE_MASK_UNICODE: DWORD = 0x00004000; pub const SEE_MASK_NO_CONSOLE: DWORD = 0x00008000; pub const SEE_MASK_ASYNCOK: DWORD = 0x00100000; pub const SEE_MASK_HMONITOR: DWORD = 0x00200000; pub const SEE_MASK_NOZONECHECKS: DWORD = 0x00800000; pub const SEE_MASK_NOQUERYCLASSSTORE: DWORD = 0x01000000; pub const SEE_MASK_WAITFORINPUTIDLE: DWORD = 0x02000000; pub const SEE_MASK_FLAG_LOG_USAGE: DWORD = 0x04000000; pub const SEE_MASK_FLAG_HINST_IS_SITE: DWORD = 0x08000000; STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct SHELLEXECUTEINFOA { cbSize: DWORD, fMask: ULONG, hwnd: HWND, lpVerb: LPCSTR, lpFile: LPCSTR, lpParameters: LPCSTR, lpDirectory: LPCSTR, nShow: c_int, hInstApp: HINSTANCE, lpIDList: *mut c_void, lpClass: LPCSTR, hkeyClass: HKEY, dwHotKey: DWORD, hMonitor: HANDLE, hProcess: HANDLE, }} pub type LPSHELLEXECUTEINFOA = *mut SHELLEXECUTEINFOA; STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct SHELLEXECUTEINFOW { cbSize: DWORD, fMask: ULONG, hwnd: HWND, lpVerb: LPCWSTR, lpFile: LPCWSTR, lpParameters: LPCWSTR, lpDirectory: LPCWSTR, nShow: c_int, hInstApp: HINSTANCE, lpIDList: *mut c_void, lpClass: LPCWSTR, hkeyClass: HKEY, dwHotKey: DWORD, hMonitor: HANDLE, hProcess: HANDLE, }} pub type LPSHELLEXECUTEINFOW = *mut SHELLEXECUTEINFOW; extern "system" { pub fn ShellExecuteExA( pExecInfo: *mut SHELLEXECUTEINFOA, ) -> BOOL; pub fn ShellExecuteExW( pExecInfo: *mut SHELLEXECUTEINFOW, ) -> BOOL; } STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct SHCREATEPROCESSINFOW { cbSize: DWORD, fMask: ULONG, hwnd: HWND, pszFile: LPCWSTR, pszParameters: LPCWSTR, pszCurrentDirectory: LPCWSTR, hUserToken: HANDLE, lpProcessAttributes: LPSECURITY_ATTRIBUTES, lpThreadAttributes: LPSECURITY_ATTRIBUTES, bInheritHandles: BOOL, dwCreationFlags: DWORD, lpStartupInfo: LPSTARTUPINFOW, lpProcessInformation: LPPROCESS_INFORMATION, }} pub type PSHCREATEPROCESSINFOW = *mut SHCREATEPROCESSINFOW; extern "system" { pub fn SHCreateProcessAsUserW( pscpi: PSHCREATEPROCESSINFOW, ) -> BOOL; pub fn SHEvaluateSystemCommandTemplate( pszCmdTemplate: PCWSTR, ppszApplication: *mut PWSTR, ppszCommandLine: *mut PWSTR, ppszParameters: *mut PWSTR, ) -> HRESULT; } ENUM!{enum ASSOCCLASS { ASSOCCLASS_SHELL_KEY = 0, ASSOCCLASS_PROGID_KEY, ASSOCCLASS_PROGID_STR, ASSOCCLASS_CLSID_KEY, ASSOCCLASS_CLSID_STR, ASSOCCLASS_APP_KEY, ASSOCCLASS_APP_STR, ASSOCCLASS_SYSTEM_STR, ASSOCCLASS_FOLDER, ASSOCCLASS_STAR, ASSOCCLASS_FIXED_PROGID_STR, ASSOCCLASS_PROTOCOL_STR, }} STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct ASSOCIATIONELEMENT { ac: ASSOCCLASS, hkClass: HKEY, pszClass: PCWSTR, }} extern "system" { pub fn AssocCreateForClasses( rgClasses: *const ASSOCIATIONELEMENT, cClasses: ULONG, riid: REFIID, ppv: *mut *mut c_void, ) -> HRESULT; } STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct SHQUERYRBINFO { cbSize: DWORD, i64Size: __int64, i64NumItems: __int64, }} pub type LPSHQUERYRBINFO = *mut SHQUERYRBINFO; pub const SHERB_NOCONFIRMATION: DWORD = 0x00000001; pub const SHERB_NOPROGRESSUI: DWORD = 0x00000002; pub const SHERB_NOSOUND: DWORD = 0x00000004; extern "system" { pub fn SHQueryRecycleBinA( pszRootPath: LPCSTR, pSHQueryRBInfo: LPSHQUERYRBINFO, ) -> HRESULT; pub fn SHQueryRecycleBinW( pszRootPath: LPCWSTR, pSHQueryRBInfo: LPSHQUERYRBINFO, ) -> HRESULT; pub fn SHEmptyRecycleBinA( hwnd: HWND, pszRootPath: LPCSTR, dwFlags: DWORD, ) -> HRESULT; pub fn SHEmptyRecycleBinW( hwnd: HWND, pszRootPath: LPCWSTR, dwFlags: DWORD, ) -> HRESULT; } ENUM!{enum QUERY_USER_NOTIFICATION_STATE { QUNS_NOT_PRESENT = 1, QUNS_BUSY = 2, QUNS_RUNNING_D3D_FULL_SCREEN = 3, QUNS_PRESENTATION_MODE = 4, QUNS_ACCEPTS_NOTIFICATIONS = 5, QUNS_QUIET_TIME = 6, QUNS_APP = 7, }} extern "system" { pub fn SHQueryUserNotificationState( pquns: *mut QUERY_USER_NOTIFICATION_STATE, ) -> HRESULT; pub fn SHGetPropertyStoreForWindow( hwnd: HWND, riid: REFIID, ppv: *mut *mut c_void, ) -> HRESULT; } UNION!{#[cfg_attr(target_arch = "x86", repr(packed))] union NOTIFYICONDATAA_u { [u32; 1], uTimeout uTimeout_mut: UINT, uVersion uVersion_mut: UINT, }} STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct NOTIFYICONDATAA { cbSize: DWORD, hWnd: HWND, uID: UINT, uFlags: UINT, uCallbackMessage: UINT, hIcon: HICON, szTip: [CHAR; 128], dwState: DWORD, dwStateMask: DWORD, szInfo: [CHAR; 256], u: NOTIFYICONDATAA_u, szInfoTitle: [CHAR; 64], dwInfoFlags: DWORD, guidItem: GUID, hBalloonIcon: HICON, }} pub type PNOTIFYICONDATAA = *mut NOTIFYICONDATAA; UNION!{#[cfg_attr(target_arch = "x86", repr(packed))] union NOTIFYICONDATAW_u { [u32; 1], uTimeout uTimeout_mut: UINT, uVersion uVersion_mut: UINT, }} STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct NOTIFYICONDATAW { cbSize: DWORD, hWnd: HWND, uID: UINT, uFlags: UINT, uCallbackMessage: UINT, hIcon: HICON, szTip: [WCHAR; 128], dwState: DWORD, dwStateMask: DWORD, szInfo: [WCHAR; 256], u: NOTIFYICONDATAW_u, szInfoTitle: [WCHAR; 64], dwInfoFlags: DWORD, guidItem: GUID, hBalloonIcon: HICON, }} pub type PNOTIFYICONDATAW = *mut NOTIFYICONDATAW; pub const NIN_SELECT: DWORD = WM_USER + 0; pub const NINF_KEY: DWORD = 0x1; pub const NIN_KEYSELECT: DWORD = NIN_SELECT | NINF_KEY; pub const NIN_BALLOONSHOW: DWORD = WM_USER + 2; pub const NIN_BALLOONHIDE: DWORD = WM_USER + 3; pub const NIN_BALLOONTIMEOUT: DWORD = WM_USER + 4; pub const NIN_BALLOONUSERCLICK: DWORD = WM_USER + 5; pub const NIN_POPUPOPEN: DWORD = WM_USER + 6; pub const NIN_POPUPCLOSE: DWORD = WM_USER + 7; pub const NIM_ADD: DWORD = 0x00000000; pub const NIM_MODIFY: DWORD = 0x00000001; pub const NIM_DELETE: DWORD = 0x00000002; pub const NIM_SETFOCUS: DWORD = 0x00000003; pub const NIM_SETVERSION: DWORD = 0x00000004; pub const NOTIFYICON_VERSION: DWORD = 3; pub const NOTIFYICON_VERSION_4: DWORD = 4; pub const NIF_MESSAGE: DWORD = 0x00000001; pub const NIF_ICON: DWORD = 0x00000002; pub const NIF_TIP: DWORD = 0x00000004; pub const NIF_STATE: DWORD = 0x00000008; pub const NIF_INFO: DWORD = 0x00000010; pub const NIF_GUID: DWORD = 0x00000020; pub const NIF_REALTIME: DWORD = 0x00000040; pub const NIF_SHOWTIP: DWORD = 0x00000080; pub const NIS_HIDDEN: DWORD = 0x00000001; pub const NIS_SHAREDICON: DWORD = 0x00000002; pub const NIIF_NONE: DWORD = 0x00000000; pub const NIIF_INFO: DWORD = 0x00000001; pub const NIIF_WARNING: DWORD = 0x00000002; pub const NIIF_ERROR: DWORD = 0x00000003; pub const NIIF_USER: DWORD = 0x00000004; pub const NIIF_ICON_MASK: DWORD = 0x0000000F; pub const NIIF_NOSOUND: DWORD = 0x00000010; pub const NIIF_LARGE_ICON: DWORD = 0x00000020; pub const NIIF_RESPECT_QUIET_TIME: DWORD = 0x00000080; STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct NOTIFYICONIDENTIFIER { cbSize: DWORD, hWnd: HWND, uID: UINT, guidItem: GUID, }} pub type PNOTIFYICONIDENTIFIER = *mut NOTIFYICONIDENTIFIER; extern "system" { pub fn Shell_NotifyIconA( dwMessage: DWORD, lpData: PNOTIFYICONDATAA, ) -> BOOL; pub fn Shell_NotifyIconW( dwMessage: DWORD, lpData: PNOTIFYICONDATAW, ) -> BOOL; pub fn Shell_NotifyIconGetRect( identifier: *const NOTIFYICONIDENTIFIER, iconLocation: *mut RECT, ) -> HRESULT; } STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct SHFILEINFOA { hIcon: HICON, iIcon: c_int, dwAttributes: DWORD, szDisplayName: [CHAR; MAX_PATH], szTypeName: [CHAR; 80], }} STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct SHFILEINFOW { hIcon: HICON, iIcon: c_int, dwAttributes: DWORD, szDisplayName: [WCHAR; MAX_PATH], szTypeName: [WCHAR; 80], }} pub const SHGFI_ICON: DWORD = 0x000000100; pub const SHGFI_DISPLAYNAME: DWORD = 0x000000200; pub const SHGFI_TYPENAME: DWORD = 0x000000400; pub const SHGFI_ATTRIBUTES: DWORD = 0x000000800; pub const SHGFI_ICONLOCATION: DWORD = 0x000001000; pub const SHGFI_EXETYPE: DWORD = 0x000002000; pub const SHGFI_SYSICONINDEX: DWORD = 0x000004000; pub const SHGFI_LINKOVERLAY: DWORD = 0x000008000; pub const SHGFI_SELECTED: DWORD = 0x000010000; pub const SHGFI_ATTR_SPECIFIED: DWORD = 0x000020000; pub const SHGFI_LARGEICON: DWORD = 0x000000000; pub const SHGFI_SMALLICON: DWORD = 0x000000001; pub const SHGFI_OPENICON: DWORD = 0x000000002; pub const SHGFI_SHELLICONSIZE: DWORD = 0x000000004; pub const SHGFI_PIDL: DWORD = 0x000000008; pub const SHGFI_USEFILEATTRIBUTES: DWORD = 0x000000010; pub const SHGFI_ADDOVERLAYS: DWORD = 0x000000020; pub const SHGFI_OVERLAYINDEX: DWORD = 0x000000040; extern "system" { pub fn SHGetFileInfoA( pszPath: LPCSTR, dwFileAttributes: DWORD, psfi: *mut SHFILEINFOA, cbFileInfo: UINT, uFlags: UINT, ) -> DWORD_PTR; pub fn SHGetFileInfoW( pszPath: LPCWSTR, dwFileAttributes: DWORD, psfi: *mut SHFILEINFOW, cbFileInfo: UINT, uFlags: UINT, ) -> DWORD_PTR; } STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct SHSTOCKICONINFO { cbSize: DWORD, hIcon: HICON, iSysImageIndex: c_int, iIcon: c_int, szPath: [WCHAR; MAX_PATH], }} pub const SHGSI_ICONLOCATION: DWORD = 0; pub const SHGSI_ICON: DWORD = SHGFI_ICON; pub const SHGSI_SYSICONINDEX: DWORD = SHGFI_SYSICONINDEX; pub const SHGSI_LINKOVERLAY: DWORD = SHGFI_LINKOVERLAY; pub const SHGSI_SELECTED: DWORD = SHGFI_SELECTED; pub const SHGSI_LARGEICON: DWORD = SHGFI_LARGEICON; pub const SHGSI_SMALLICON: DWORD = SHGFI_SMALLICON; pub const SHGSI_SHELLICONSIZE: DWORD = SHGFI_SHELLICONSIZE; ENUM!{enum SHSTOCKICONID { SIID_DOCNOASSOC = 0, SIID_DOCASSOC = 1, SIID_APPLICATION = 2, SIID_FOLDER = 3, SIID_FOLDEROPEN = 4, SIID_DRIVE525 = 5, SIID_DRIVE35 = 6, SIID_DRIVEREMOVE = 7, SIID_DRIVEFIXED = 8, SIID_DRIVENET = 9, SIID_DRIVENETDISABLED = 10, SIID_DRIVECD = 11, SIID_DRIVERAM = 12, SIID_WORLD = 13, SIID_SERVER = 15, SIID_PRINTER = 16, SIID_MYNETWORK = 17, SIID_FIND = 22, SIID_HELP = 23, SIID_SHARE = 28, SIID_LINK = 29, SIID_SLOWFILE = 30, SIID_RECYCLER = 31, SIID_RECYCLERFULL = 32, SIID_MEDIACDAUDIO = 40, SIID_LOCK = 47, SIID_AUTOLIST = 49, SIID_PRINTERNET = 50, SIID_SERVERSHARE = 51, SIID_PRINTERFAX = 52, SIID_PRINTERFAXNET = 53, SIID_PRINTERFILE = 54, SIID_STACK = 55, SIID_MEDIASVCD = 56, SIID_STUFFEDFOLDER = 57, SIID_DRIVEUNKNOWN = 58, SIID_DRIVEDVD = 59, SIID_MEDIADVD = 60, SIID_MEDIADVDRAM = 61, SIID_MEDIADVDRW = 62, SIID_MEDIADVDR = 63, SIID_MEDIADVDROM = 64, SIID_MEDIACDAUDIOPLUS = 65, SIID_MEDIACDRW = 66, SIID_MEDIACDR = 67, SIID_MEDIACDBURN = 68, SIID_MEDIABLANKCD = 69, SIID_MEDIACDROM = 70, SIID_AUDIOFILES = 71, SIID_IMAGEFILES = 72, SIID_VIDEOFILES = 73, SIID_MIXEDFILES = 74, SIID_FOLDERBACK = 75, SIID_FOLDERFRONT = 76, SIID_SHIELD = 77, SIID_WARNING = 78, SIID_INFO = 79, SIID_ERROR = 80, SIID_KEY = 81, SIID_SOFTWARE = 82, SIID_RENAME = 83, SIID_DELETE = 84, SIID_MEDIAAUDIODVD = 85, SIID_MEDIAMOVIEDVD = 86, SIID_MEDIAENHANCEDCD = 87, SIID_MEDIAENHANCEDDVD = 88, SIID_MEDIAHDDVD = 89, SIID_MEDIABLURAY = 90, SIID_MEDIAVCD = 91, SIID_MEDIADVDPLUSR = 92, SIID_MEDIADVDPLUSRW = 93, SIID_DESKTOPPC = 94, SIID_MOBILEPC = 95, SIID_USERS = 96, SIID_MEDIASMARTMEDIA = 97, SIID_MEDIACOMPACTFLASH = 98, SIID_DEVICECELLPHONE = 99, SIID_DEVICECAMERA = 100, SIID_DEVICEVIDEOCAMERA = 101, SIID_DEVICEAUDIOPLAYER = 102, SIID_NETWORKCONNECT = 103, SIID_INTERNET = 104, SIID_ZIPFILE = 105, SIID_SETTINGS = 106, SIID_DRIVEHDDVD = 132, SIID_DRIVEBD = 133, SIID_MEDIAHDDVDROM = 134, SIID_MEDIAHDDVDR = 135, SIID_MEDIAHDDVDRAM = 136, SIID_MEDIABDROM = 137, SIID_MEDIABDR = 138, SIID_MEDIABDRE = 139, SIID_CLUSTEREDDRIVE = 140, SIID_MAX_ICONS = 181, }} pub const SIID_INVALID: SHSTOCKICONID = -1i32 as u32; extern "system" { pub fn SHGetStockIconInfo( siid: SHSTOCKICONID, uFlags: UINT, psii: *mut SHSTOCKICONINFO, ) -> HRESULT; pub fn SHGetDiskFreeSpaceExA( pszDirectoryName: LPCSTR, pulFreeBytesAvailableToCaller: *mut ULARGE_INTEGER, pulTotalNumberOfBytes: *mut ULARGE_INTEGER, pulTotalNumberOfFreeBytes: *mut ULARGE_INTEGER, ) -> BOOL; pub fn SHGetDiskFreeSpaceExW( pszDirectoryName: LPCWSTR, pulFreeBytesAvailableToCaller: *mut ULARGE_INTEGER, pulTotalNumberOfBytes: *mut ULARGE_INTEGER, pulTotalNumberOfFreeBytes: *mut ULARGE_INTEGER, ) -> BOOL; pub fn SHGetNewLinkInfoA( pszLinkTo: LPCSTR, pszDir: LPCSTR, pszName: LPSTR, pfMustCopy: *mut BOOL, uFlags: UINT, ) -> BOOL; pub fn SHGetNewLinkInfoW( pszLinkTo: LPCWSTR, pszDir: LPCWSTR, pszName: LPWSTR, pfMustCopy: *mut BOOL, uFlags: UINT, ) -> BOOL; } pub const SHGNLI_PIDL: DWORD = 0x000000001; pub const SHGNLI_PREFIXNAME: DWORD = 0x000000002; pub const SHGNLI_NOUNIQUE: DWORD = 0x000000004; pub const SHGNLI_NOLNK: DWORD = 0x000000008; pub const SHGNLI_NOLOCNAME: DWORD = 0x000000010; pub const SHGNLI_USEURLEXT: DWORD = 0x000000020; pub const PRINTACTION_OPEN: DWORD = 0; pub const PRINTACTION_PROPERTIES: DWORD = 1; pub const PRINTACTION_NETINSTALL: DWORD = 2; pub const PRINTACTION_NETINSTALLLINK: DWORD = 3; pub const PRINTACTION_TESTPAGE: DWORD = 4; pub const PRINTACTION_OPENNETPRN: DWORD = 5; pub const PRINTACTION_DOCUMENTDEFAULTS: DWORD = 6; pub const PRINTACTION_SERVERPROPERTIES: DWORD = 7; extern "system" { pub fn SHInvokePrinterCommandA( hwnd: HWND, uAction: UINT, lpBuf1: LPCSTR, lpBuf2: LPCSTR, fModal: BOOL, ) -> BOOL; pub fn SHInvokePrinterCommandW( hwnd: HWND, uAction: UINT, lpBuf1: LPCWSTR, lpBuf2: LPCWSTR, fModal: BOOL, ) -> BOOL; } STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct OPEN_PRINTER_PROPS_INFOA { dwSize: DWORD, pszSheetName: LPSTR, uSheetIndex: UINT, dwFlags: DWORD, bModal: BOOL, }} pub type POPEN_PRINTER_PROPS_INFOA = *mut OPEN_PRINTER_PROPS_INFOA; STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct OPEN_PRINTER_PROPS_INFOW { dwSize: DWORD, pszSheetName: LPWSTR, uSheetIndex: UINT, dwFlags: DWORD, bModal: BOOL, }} pub type POPEN_PRINTER_PROPS_INFOW = *mut OPEN_PRINTER_PROPS_INFOW; pub const PRINT_PROP_FORCE_NAME: DWORD = 0x01; extern "system" { pub fn SHLoadNonloadedIconOverlayIdentifiers() -> HRESULT; pub fn SHIsFileAvailableOffline( pwszPath: PCWSTR, pdwStatus: *mut DWORD, ) -> HRESULT; } pub const OFFLINE_STATUS_LOCAL: DWORD = 0x0001; pub const OFFLINE_STATUS_REMOTE: DWORD = 0x0002; pub const OFFLINE_STATUS_INCOMPLETE: DWORD = 0x0004; extern "system" { pub fn SHSetLocalizedName( pszPath: PCWSTR, pszResModule: PCWSTR, idsRes: c_int, ) -> HRESULT; pub fn SHRemoveLocalizedName( pszPath: PCWSTR, ) -> HRESULT; pub fn SHGetLocalizedName( pszPath: PCWSTR, pszResModule: PWSTR, cch: UINT, pidsRes: *mut c_int, ) -> HRESULT; } extern "C" { pub fn ShellMessageBoxA( hAppInst: HINSTANCE, hWnd: HWND, lpcText: LPCSTR, lpcTitle: LPCSTR, fuStyle: UINT, ... ) -> c_int; pub fn ShellMessageBoxW( hAppInst: HINSTANCE, hWnd: HWND, lpcText: LPCWSTR, lpcTitle: LPCWSTR, fuStyle: UINT, ... ) -> c_int; } extern "system" { pub fn IsLFNDriveA( pszPath: LPCSTR, ) -> BOOL; pub fn IsLFNDriveW( pszPath: LPCWSTR, ) -> BOOL; pub fn SHEnumerateUnreadMailAccountsA( hKeyUser: HKEY, dwIndex: DWORD, pszMailAddress: LPSTR, cchMailAddress: c_int, ) -> HRESULT; pub fn SHEnumerateUnreadMailAccountsW( hKeyUser: HKEY, dwIndex: DWORD, pszMailAddress: LPWSTR, cchMailAddress: c_int, ) -> HRESULT; pub fn SHGetUnreadMailCountA( hKeyUser: HKEY, pszMailAddress: LPCSTR, pdwCount: *mut DWORD, pFileTime: *mut FILETIME, pszShellExecuteCommand: LPSTR, cchShellExecuteCommand: c_int, ) -> HRESULT; pub fn SHGetUnreadMailCountW( hKeyUser: HKEY, pszMailAddress: LPCWSTR, pdwCount: *mut DWORD, pFileTime: *mut FILETIME, pszShellExecuteCommand: LPWSTR, cchShellExecuteCommand: c_int, ) -> HRESULT; pub fn SHSetUnreadMailCountA( pszMailAddress: LPCSTR, dwCount: DWORD, pszShellExecuteCommand: LPCSTR, ) -> HRESULT; pub fn SHSetUnreadMailCountW( pszMailAddress: LPCWSTR, dwCount: DWORD, pszShellExecuteCommand: LPCWSTR, ) -> HRESULT; pub fn SHTestTokenMembership( hToken: HANDLE, ulRID: ULONG, ) -> BOOL; pub fn SHGetImageList( iImageList: c_int, riid: REFIID, ppvObj: *mut *mut c_void, ) -> HRESULT; } pub const SHIL_LARGE: DWORD = 0; pub const SHIL_SMALL: DWORD = 1; pub const SHIL_EXTRALARGE: DWORD = 2; pub const SHIL_SYSSMALL: DWORD = 3; pub const SHIL_JUMBO: DWORD = 4; pub const SHIL_LAST: DWORD = SHIL_JUMBO; FN!{stdcall PFNCANSHAREFOLDERW( pszPath: PCWSTR, ) -> HRESULT} FN!{stdcall PFNSHOWSHAREFOLDERUIW( hwndParent: HWND, pszPath: PCWSTR, ) -> HRESULT} pub const WC_NETADDRESS: &'static str = "msctls_netaddress"; extern "system" { pub fn InitNetworkAddressControl() -> BOOL; } // STRUCT!{struct NC_ADDRESS { // pAddrInfo: *mut NET_ADDRESS_INFO, // PortNumber: USHORT, // PrefixLength: BYTE, // }} // pub type PNC_ADDRESS = *mut NC_ADDRESS; extern "system" { pub fn SHGetDriveMedia( pszDrive: PCWSTR, pdwMediaContent: *mut DWORD, ) -> HRESULT; }