24 wprintf(
L"shlextdbg /clsid={clsid} [/dll=dllname] /IShellExtInit=filename |shlextype| |waitoptions|\n");
25 wprintf(
L" {clsid}: The CLSID or ProgID of the object to create\n");
26 wprintf(
L" dll: Optional dllname to create the object from, instead of CoCreateInstance\n");
27 wprintf(
L" filename: The filename to pass to IShellExtInit->Initialze\n");
28 wprintf(
L" shlextype: The type of shell extention to run:\n");
29 wprintf(
L" /IShellPropSheetExt to create a property sheet\n");
30 wprintf(
L" /IContextMenu=verb to activate the specified verb\n");
31 wprintf(
L" waitoptions: Specify how to wait:\n");
32 wprintf(
L" /explorerinstance: Wait for SHGetInstanceExplorer (Default)\n");
33 wprintf(
L" /infinite: Keep on waiting infinitely\n");
34 wprintf(
L" /openwindows: Wait for all windows from the current application to close\n");
35 wprintf(
L" /input: Wait for input\n");
39 wprintf(
L" Call SHGetFileInfo. Prefix path with $ to parse as a pidl.\n");
41 wprintf(
L"shlextdbg /assocq <[{bhid}]path> <string|data|key> <type> <initflags> <queryflags> <initstring> [extra] [maxsize]\n");
42 wprintf(
L" Uses the default implementation from AssocCreate if path is empty.\n");
44 wprintf(
L"shlextdbg /shellexec=path [/see] [verb] [class]\n");
46 wprintf(
L"shlextdbg /dumpmenu=[{clsid}]path [/cmf]\n");
129 IQueryAssociations* pQA;
141 info.dwAttributes = 0;
143 if (
info.dwAttributes & SFGAO_FOLDER)
147 else if (
info.dwAttributes & SFGAO_BROWSABLE)
196 bool recurse = Indent !=
UINT(-1);
218 for (
UINT j = 0;
j < Indent && recurse; ++
j)
258 info.dwAttributes = 0;
301 hr = si->BindToHandler(
NULL, pclsid ? *pclsid : BHID_AssociationArray,
IID_PPV_ARG(IQueryAssociations, &qa));
303 hr = si->BindToHandler(
NULL, BHID_SFUIObject,
IID_PPV_ARG(IQueryAssociations, &qa));
415 wprintf(
L"Failed to bind to parent: 0x%x\n",
hr);
421 wprintf(
L"Failed to query IDataObject: 0x%x\n",
hr);
450 tDllGetClassObject DllGet = (tDllGetClassObject)
GetProcAddress(
mod,
"DllGetClassObject");
460 wprintf(
L"Failed to create IClassFactory: 0x%x\n",
hr);
466 wprintf(
L"Failed to Request IShellExtInit from IClassFactory: 0x%x\n",
hr);
479 hr = spShellExtInit->Initialize(pidl, spDataObject,
hKey);
484 wprintf(
L"IShellExtInit->Initialize failed: 0x%x\n",
hr);
487 hr = spShellExtInit->QueryInterface(
riid,
ppv);
527 wprintf(
L"All windows closed (ignoring console window)\n");
538 static const QITAB rgqit[] = { { 0 } };
544 wprintf(
L"INFO: SHGetInstanceExplorer\n");
550 wprintf(
L"INFO: Release ExplorerInstance\n");
574 LPCWSTR nag =
L"(Please use SHGetInstanceExplorer in your code instead)";
589 wprintf(
L"Press any key to continue... %s\n", nag);
604 wprintf(
L"Propsheet failed to pass lParam, got: 0x%Ix\n",
lParam);
616 if (*
cmd ==
':' || *
cmd ==
'=')
646 bool failArgs =
false;
650 if (
cmd[0] ==
'-' ||
cmd[0] ==
'/')
662 if (
argc - (
n + 1) >= 6 &&
argc - (
n + 1) <= 8)
724 UINT cmf = 0, nosub = 0, fakeinit = 0;
730 cmf |= CMF_DEFAULTONLY;
732 cmf |= CMF_NODEFAULT;
734 cmf |= CMF_DONOTPICKDEFAULT;
736 cmf |= CMF_EXTENDEDVERBS;
738 cmf |= CMF_SYNCCASCADEMENU;
742 cmf |= CMF_VERBSONLY;
746 cmf |= CMF_DISABLEDVERBS;
748 cmf |= CMF_OPTIMIZEFORINVOKE;
750 cmf |= CMF_CANRENAME;
759 hr = cm->QueryContextMenu(hMenu, 0,
first,
last, cmf);
829 CLSID EmptyCLSID = { 0 };
853 wprintf(
L"IShellPropSheetExt->AddPages failed: 0x%x\n",
hr);
865 psh.
nStartPage = ActivePage ? (ActivePage-1) : 0;
868 wprintf(
L"PropertySheetW returned: 0x%x\n",
hr);
879 CMINVOKECOMMANDINFO cm = {
sizeof(cm), 0 };
882 hr = spContextMenu->InvokeCommand(&cm);
886 wprintf(
L"IContextMenu->InvokeCommand failed: 0x%x\n",
hr);
889 wprintf(
L"IContextMenu->InvokeCommand returned: 0x%x\n",
hr);
EXTERN_C HRESULT WINAPI SHCreateShellItem(PCIDLIST_ABSOLUTE pidlParent, IShellFolder *psfParent, PCUITEMID_CHILD pidl, IShellItem **ppsi)
std::map< E_MODULE, HMODULE > mod
PRTL_UNICODE_STRING_BUFFER Path
#define InterlockedIncrement
#define InterlockedDecrement
#define STDMETHODCALLTYPE
#define RegCloseKey(hKey)
bool IsEmpty() const noexcept
PXSTR GetString() noexcept
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
#define ERROR_INSUFFICIENT_BUFFER
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
INT_PTR WINAPI PropertySheetW(LPCPROPSHEETHEADERW lppsh)
#define ERROR_INVALID_PARAMETER
#define GetProcAddress(x, y)
static const WCHAR *const ext[]
HWND WINAPI DECLSPEC_HOTPATCH GetConsoleWindow(VOID)
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
void WINAPI SHFree(LPVOID pv)
HRESULT WINAPI AssocCreate(CLSID clsid, REFIID refiid, void **lpInterface)
HRESULT WINAPI QISearch(void *base, const QITAB *table, REFIID riid, void **ppv)
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
DWORD WINAPI SHGetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
#define check(expected, result)
GLdouble GLdouble GLdouble r
GLenum GLuint GLenum GLsizei const GLchar * buf
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
_Check_return_opt_ _CRTIMP int __cdecl _putws(_In_z_ const wchar_t *_Str)
_Check_return_ long __cdecl wcstol(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define ERROR_FILE_NOT_FOUND
static DWORD DWORD void LPSTR DWORD cch
static HMODULE MODULEINFO DWORD cb
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
struct _PSP * HPROPSHEETPAGE
const GUID IID_IDataObject
HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
#define ICC_STANDARD_CLASSES
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown *pUnk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, BOOL useIContextMenu2)
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
#define SHGFI_SYSICONINDEX
#define SHGFI_ICONLOCATION
#define SHGFI_DISPLAYNAME
#define SHGFI_USEFILEATTRIBUTES
#define SEE_MASK_CLASSNAME
#define SEE_MASK_INVOKEIDLIST
#define SEE_MASK_FLAG_NO_UI
VOID WINAPI SHSetInstanceExplorer(LPUNKNOWN lpUnknown)
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
static BOOL CALLBACK cb_AddPage(HPROPSHEETPAGE page, LPARAM lParam)
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
static void GetAssocClass(LPCWSTR Path, LPCITEMIDLIST pidl, HKEY &hKey)
static HRESULT GetCommandString(IContextMenu &CM, UINT Id, UINT Type, LPWSTR buf, UINT cchMax)
static bool isCmdWithArg(int argc, WCHAR **argv, int &n, PCWSTR check, PCWSTR &arg)
static void DumpMenu(HMENU hMenu, UINT IdOffset, IContextMenu *pCM, BOOL FakeInit, UINT Indent)
static HRESULT GetUIObjectOfAbsolute(LPCITEMIDLIST pidl, REFIID riid, void **ppv)
CSimpleArray< HWND > g_Windows
static bool CLSIDPrefix(T &String, CLSID &Clsid)
static bool isCmd(int argc, WCHAR **argv, int n, PCWSTR check)
static LONG StrToNum(PCWSTR in)
HRESULT LoadAndInitialize(REFIID riid, LPVOID *ppv)
static void DumpBytes(const void *Data, SIZE_T cb)
bool g_bIShellPropSheetExt
static HRESULT CreateShellItemFromParse(PCWSTR Path, IShellItem **ppSI)
HRESULT CreateIDataObject(CComHeapPtr< ITEMIDLIST > &pidl, CComPtr< IDataObject > &dataObject, PCWSTR FileName)
CSimpleArray< HPROPSHEETPAGE > g_Pages
static int SHGFI(PCWSTR Path)
static int ErrMsg(int Error)
static HRESULT AssocQ(int argc, WCHAR **argv)
@ ASSOCSTR_FRIENDLYDOCNAME
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
virtual ULONG STDMETHODCALLTYPE AddRef()
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv)
virtual ULONG STDMETHODCALLTYPE Release()
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
TW_UINT32 TW_UINT16 TW_UINT16 MSG
#define FIELD_OFFSET(t, f)
#define INVALID_FILE_ATTRIBUTES
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
DWORD WINAPI GetLastError(void)
#define GetFileAttributes
#define FORMAT_MESSAGE_IGNORE_INSERTS
DWORD WINAPI GetCurrentProcessId(void)
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
#define FORMAT_MESSAGE_FROM_SYSTEM
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
#define HRESULT_FROM_WIN32(x)
#define HKEY_CLASSES_ROOT
HMENU WINAPI CreatePopupMenu(void)
UINT WINAPI GetMenuDefaultItem(_In_ HMENU hMenu, _In_ UINT fByPos, _In_ UINT gmdiFlags)
BOOL WINAPI EnumWindows(_In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam)
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define IID_PPV_ARG(Itype, ppType)