399 lines
11 KiB
C++
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;
|
||
|
}
|
||
|
|
||
|
|