windows-nt/Source/XPSP1/NT/shell/ext/shfolder/app/app.cpp
2020-09-26 16:20:57 +08:00

399 lines
11 KiB
C++

// app.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <shlobj.h>
#include <shfolder.h>
#include <windowsx.h>
#include <resource.h>
#define chHANDLE_DLGMSG(hwnd, message, fn) \
case (message): return (SetDlgMsgResult(hwnd, uMsg, \
HANDLE_##message((hwnd), (wParam), (lParam), (fn))))
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
#define SHAnsiToUnicode(psz, pwsz, cchwsz) MultiByteToWideChar(CP_ACP, 0, psz, -1, pwsz, cchwsz);
#define SHUnicodeToAnsi(pwsz, psz, cchsz) WideCharToMultiByte(CP_ACP, 0, pwsz, -1, psz, cchsz, NULL, NULL);
#ifdef UNICODE
#else
#define SHTCharToUnicode(t, w, cc) SHAnsiToUnicode(t, w, cc)
#endif
#define Q(x) #x,x
#define HKCU HKEY_CURRENT_USER
#define HKLM HKEY_LOCAL_MACHINE
struct {
CHAR *pszName;
UINT csidl;
HKEY hkey;
char *pszRegValue;
} Folders[] = {
Q(CSIDL_DESKTOP), 0,0,
Q(CSIDL_INTERNET),0,0,
Q(CSIDL_PROGRAMS), HKCU,"Programs",
Q(CSIDL_CONTROLS), 0,0,
Q(CSIDL_PRINTERS), 0,0,
Q(CSIDL_PERSONAL), HKCU, "Personal",
Q(CSIDL_FAVORITES), HKCU, "Favorites",
Q(CSIDL_STARTUP), HKCU, "Startup",
Q(CSIDL_RECENT), HKCU, "Recent",
Q(CSIDL_SENDTO), HKCU, "SendTo",
Q(CSIDL_BITBUCKET),0,0,
Q(CSIDL_STARTMENU), HKCU, "Start Menu",
Q(CSIDL_DESKTOPDIRECTORY), HKCU, "Desktop",
Q(CSIDL_DRIVES), 0,0,
Q(CSIDL_NETWORK), 0,0,
Q(CSIDL_NETHOOD), HKCU, "NetHood",
Q(CSIDL_FONTS), HKCU, "Fonts",
Q(CSIDL_TEMPLATES), HKCU, "Templates",
Q(CSIDL_COMMON_STARTMENU),HKLM, "Common Start Menu",
Q(CSIDL_COMMON_PROGRAMS), HKLM, "Common Programs",
Q(CSIDL_COMMON_STARTUP), HKLM, "Common Startup",
Q(CSIDL_COMMON_DESKTOPDIRECTORY), HKLM, "Common Desktop",
Q(CSIDL_APPDATA), HKCU, "AppData",
Q(CSIDL_PRINTHOOD), HKCU, "PrintHood",
Q(CSIDL_LOCAL_APPDATA), HKCU, "Local AppData",
Q(CSIDL_ALTSTARTUP), HKCU, "AltStartup",
Q(CSIDL_COMMON_ALTSTARTUP), HKLM, "Common AltStartup",
Q(CSIDL_COMMON_FAVORITES), HKLM, "Common Favorites",
Q(CSIDL_INTERNET_CACHE), HKCU, "Cache",
Q(CSIDL_COOKIES), HKCU, "Cookies",
Q(CSIDL_HISTORY), HKCU, "History",
Q(CSIDL_COMMON_APPDATA), HKLM, "Common AppData",
Q(CSIDL_WINDOWS),0,0,
Q(CSIDL_SYSTEM),0,0,
Q(CSIDL_PROGRAM_FILES),0,0,
Q(CSIDL_MYPICTURES),HKCU, "My Pictures",
Q(CSIDL_PROFILE),0,0,
Q(CSIDL_SYSTEMX86),0,0,
Q(CSIDL_PROGRAM_FILESX86),0,0,
Q(CSIDL_PROGRAM_FILES_COMMON),0,0,
Q(CSIDL_PROGRAM_FILES_COMMONX86),0,0,
Q(CSIDL_COMMON_TEMPLATES),HKLM, "Common Templates",
Q(CSIDL_COMMON_DOCUMENTS), HKLM, "Common Documents",
Q(CSIDL_COMMON_ADMINTOOLS), HKLM, "Common Administrative Tools",
Q(CSIDL_ADMINTOOLS), HKCU, "Administrative Tools",
/*
*/
"Invalid",0xff,0,0,
};
HANDLE GetCurrentUserToken()
{
HANDLE hToken;
if (OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &hToken) ||
OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
return hToken;
return NULL;
}
const CHAR c_szUSF[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";
const CHAR c_szSF[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
void AddToList(HWND hwndList, UINT iItem, HRESULT hr, UINT iFolder, BOOL fUnicode, LPBYTE pzPath, BOOL fCreate)
{
LVITEMA lva;
LVITEMW lvw;
CHAR sz[MAX_PATH];
WCHAR wsz[MAX_PATH];
ZeroMemory(&lva, sizeof(lva));
ZeroMemory(&lvw, sizeof(lvw));
lva.mask = lvw.mask = LVIF_TEXT;
lva.iItem = lvw.iItem = iItem;
wsprintf(sz, "%x", hr);
lva.pszText = sz;
lva.iSubItem = 0;
if (iItem != SendMessageA(hwndList, LVM_INSERTITEMA, 0, (LPARAM)&lva))
MessageBox(0, "debug",0, MB_OK);
if (fUnicode)
{
lvw.pszText = (WCHAR*)pzPath;
lvw.iSubItem = 1;
SendMessageW(hwndList,LVM_SETITEMW,0, (LPARAM)&lvw);
lva.pszText = "1";
lva.iSubItem = 4;
SendMessageA(hwndList, LVM_SETITEMA, 0, (LPARAM)&lva);
}
else
{
lva.pszText = (CHAR*)pzPath;
lva.iSubItem = 1;
SendMessageA(hwndList,LVM_SETITEMA,0, (LPARAM)&lva);
lva.pszText = "0";
lva.iSubItem = 4;
SendMessageA(hwndList,LVM_SETITEMA, 0, (LPARAM)&lva);
}
if (Folders[iFolder].hkey)
{
HKEY hkey;
DWORD dwType;
DWORD dwSize;
wsz[0] = 0;
sz[0] = 0;
if (ERROR_SUCCESS == RegOpenKey(Folders[iFolder].hkey, c_szUSF, &hkey))
{
if (fUnicode)
{
WCHAR wszRegValue[MAX_PATH];
dwSize = sizeof(sz);
SHAnsiToUnicode( Folders[iFolder].pszRegValue, wszRegValue, MAX_PATH);
RegQueryValueExW(hkey, wszRegValue, 0, &dwType, (LPBYTE) wsz, &dwSize);
lvw.iSubItem = 2;
lvw.pszText = wsz;
SendMessageW(hwndList, LVM_SETITEMW, 0, (LPARAM)&lvw);
}
else
{
DWORD dwSize = sizeof(sz);
RegQueryValueExA(hkey, Folders[iFolder].pszRegValue, 0, &dwType, (LPBYTE)sz,&dwSize );
lva.iSubItem = 2;
lva.pszText = sz;
SendMessageA(hwndList, LVM_SETITEMA, 0, (LPARAM)&lva);
}
RegCloseKey(hkey);
}
if (ERROR_SUCCESS == RegOpenKey(Folders[iFolder].hkey, c_szSF, &hkey))
{
if (fUnicode)
{
WCHAR wszRegValue[MAX_PATH];
dwSize = sizeof(wsz);
SHAnsiToUnicode( Folders[iFolder].pszRegValue, wszRegValue, MAX_PATH);
RegQueryValueExW(hkey, wszRegValue, 0, &dwType, (LPBYTE) wsz, &dwSize);
lvw.iSubItem = 3;
lvw.pszText = wsz;
SendMessageW(hwndList, LVM_SETITEMW, 0, (LPARAM)&lvw);
}
else
{
DWORD dwSize = sizeof(sz);
RegQueryValueExA(hkey, Folders[iFolder].pszRegValue, 0, &dwType, (LPBYTE)sz, &dwSize);
lva.iSubItem = 3;
lva.pszText = sz;
SendMessageA(hwndList, LVM_SETITEMA, 0, (LPARAM)&lva);
}
RegCloseKey(hkey);
}
}
else
{
lva.pszText = "N/A";
lva.iSubItem = 2;
SendMessageA(hwndList, LVM_SETITEMA, 0, (LPARAM)&lva);
lva.iSubItem = 3;
SendMessageA(hwndList, LVM_SETITEMA, 0, (LPARAM)&lva);
}
lva.iSubItem = 5;
if (fCreate)
lva.pszText = "1";
else
lva.pszText = "0";
SendMessageA(hwndList, LVM_SETITEMA, 0, (LPARAM)&lva);
}
void CheckFolders( HWND hList)
{
int i;
int j;
static HINSTANCE hmod;
PFNSHGETFOLDERPATHA GetFolderPathA;
PFNSHGETFOLDERPATHW GetFolderPathW;
CHAR szDll[] = "shfolder.dll";
hmod = LoadLibrary(szDll);
if( !hmod) {
MessageBoxA(0,"couldn't find your dll %s\n", 0, MB_OK);
ExitProcess(1);
}
GetFolderPathA = (PFNSHGETFOLDERPATHA) GetProcAddress( hmod, "SHGetFolderPathA");
GetFolderPathW = (PFNSHGETFOLDERPATHW) GetProcAddress( hmod, "SHGetFolderPathW");
// SendMessageA(hList, LB_RESETCONTENT,0,0);
SendMessage(hList, LVM_DELETEALLITEMS,0,0);
for ( i=0,j=0; i< ARRAYSIZE(Folders); i++)
{
CHAR szPath[MAX_PATH];
WCHAR wszPath[MAX_PATH];
HRESULT hr;
CHAR szOut[MAX_PATH];
WCHAR wszOut[MAX_PATH];
WCHAR wszConv[MAX_PATH];
LPBYTE pzPath;
int k;
for (k=0; k<6; k++)
{
BOOL fCreate = (k == 3) || (k == 2);
if (k%2)
{
hr = GetFolderPathW(NULL, Folders[i].csidl |fCreate, NULL,0, wszPath);
pzPath = (LPBYTE) wszPath;
}
else
{
hr = GetFolderPathA(NULL, Folders[i].csidl | fCreate, NULL, 0, szPath);
pzPath = (LPBYTE) szPath;
}
AddToList(hList, j++ ,hr, i, k%2, pzPath, fCreate);
}
}
}
BOOL Dlg_OnInitDialog (HWND hwnd, HWND hwndFocus,
LPARAM lParam)
{
RECT rc;
LVCOLUMN lvc;
HWND hwndList = GetDlgItem(hwnd, IDC_LIST1);
ZeroMemory(&lvc, sizeof(lvc));
lvc.mask = LVCF_FMT | LVCF_ORDER |LVCF_SUBITEM | LVCF_TEXT;
lvc.fmt = LVCFMT_LEFT;
lvc.pszText = "HRESULT";
lvc.iOrder = 0;
lvc.iSubItem = 0;
ListView_InsertColumn(hwndList, 0, &lvc);
lvc.pszText = "Value";
lvc.iOrder = 1;
lvc.iSubItem = 1;
ListView_InsertColumn(hwndList, 1, &lvc);
lvc.pszText ="USF value";
lvc.iOrder =2 ;
lvc.iSubItem = 2;
ListView_InsertColumn(hwndList, 2, &lvc);
lvc.pszText = "SF value";
lvc.iOrder = 3;
lvc.iSubItem = 3;
ListView_InsertColumn(hwndList, 3, &lvc);
lvc.pszText = "Unicode";
lvc.iOrder = 4;
lvc.iSubItem = 4;
ListView_InsertColumn(hwndList, 4, &lvc);
lvc.pszText = "Create";
lvc.iOrder = 5;
lvc.iSubItem = 5;
ListView_InsertColumn(hwndList, 5, &lvc);
// Associate an icon with the dialog box.
CheckFolders(hwndList);
GetClientRect(hwnd, &rc);
SetWindowPos(GetDlgItem(hwnd, IDC_LIST1), NULL,
0, 0, rc.right, rc.bottom, SWP_NOZORDER);
return(TRUE);
}
void Dlg_OnSize (HWND hwnd, UINT state, int cx, int cy) {
// SetWindowPos(GetDlgItem(hwnd, IDC_LIST1), NULL, 0, 0,
// cx, cy, SWP_NOZORDER);
}
void Dlg_OnCommand (HWND hwnd, int id, HWND hwndCtl,
UINT codeNotify)
{
switch (id)
{
case IDCANCEL:
EndDialog(hwnd, id);
break;
case IDOK:
// Call the recursive routine to walk the tree.
CheckFolders(GetDlgItem(hwnd, IDC_LIST1));
break;
}
}
BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);
chHANDLE_DLGMSG(hwnd, WM_SIZE, Dlg_OnSize);
chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand);
}
return(FALSE);
}
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR pszArgs, INT command)
{
#if 0
if (argc > 1)
SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_PATH, argv[1], NULL);
Sleep(6000);
#endif
CoInitialize(0);
DialogBox( hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, Dlg_Proc);
GetLastError();
#if 0
SHFILEINFO fi;
SHGetFileInfo(TEXT("\\\\chrisg06\\public"), FILE_ATTRIBUTE_DIRECTORY, &fi, sizeof(fi), SHGFI_USEFILEATTRIBUTES | SHGFI_DISPLAYNAME | SHGFI_ICON);
{
TCHAR szPath[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, GetCurrentUserToken(), 0, szPath);
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, 0, szPath);
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES_COMMON, NULL, 0, szPath);
SHGetFolderPath(NULL, CSIDL_COMMON_DOCUMENTS | CSIDL_FLAG_CREATE, NULL, 0, szPath);
SHGetFolderPath(NULL, CSIDL_COMMON_TEMPLATES | CSIDL_FLAG_CREATE, NULL, 0, szPath);
SHGetFolderPath(NULL, CSIDL_RECENT, NULL, 0, szPath);
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, 0, szPath);
SHGetFolderPath(NULL, CSIDL_MYPICTURES | CSIDL_FLAG_CREATE, NULL, 0, szPath);
SHGetFolderPath(NULL, CSIDL_MYPICTURES, NULL, 0, szPath);
// SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, szPath);
// SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, szPath);
}
#endif
CoUninitialize();
return 0;
}