Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

276 lines
7.1 KiB

#include <windows.h>
#include "RegEdit.h"
#ifndef DBCS
#define AnsiNext(x) ((x)+1)
#endif
#define NUMACTIONS (ID_LASTACTIONRADIO-ID_FIRSTACTIONRADIO+1)
#define EDITSPERACTION (ID_LASTEDIT-ID_FIRSTACTIONEDIT+1)
#define OFFSET_COMMAND 0
#define OFFSET_FIRSTDDE 1
#define OFFSET_DDEEXEC 1
#define OFFSET_DDEIFEXEC 2
#define OFFSET_DDEAPP 3
#define OFFSET_DDETOPIC 4
#define BLOCKLEN 100
char szNull[] = "";
static char szShell[] = "shell";
static char szCommand[] = "command";
static char szDDEExec[] = "ddeexec";
static char szDDEIfExec[] = "ddeexec\\ifexec";
static char szDDEApplication[] = "ddeexec\\application";
static char szDDETopic[] = "ddeexec\\topic";
static char *ppCommands[] = {
szCommand, szDDEExec, szDDEIfExec, szDDEApplication, szDDETopic
} ;
static char szOpen[] = "open";
static char szPrint[] = "print";
static char *ppActionIds[] = {
szOpen, szPrint
} ;
static char szSystem[] = "System";
char cUsesDDE[NUMACTIONS];
HANDLE *pLocalVals = NULL;
WORD NEAR PASCAL CreateId(HANDLE hId)
{
HKEY hKeyNew;
PSTR pId, pTemp;
WORD wErrMsg = IDS_INVALIDID;
pId = LocalLock(hId);
if(!*pId || *pId=='.')
goto Error1;
for(pTemp=pId; *pTemp; ++pTemp)
/* this excludes '\\' and all other chars except 33-127 */
if(*pTemp=='\\' || *pTemp<=' ')
goto Error1;
wErrMsg = IDS_EXISTS;
if(RegOpenKey(HKEY_CLASSES_ROOT, pId, &hKeyNew) == ERROR_SUCCESS)
goto Error2;
if(wErrMsg=GetErrMsg((WORD)RegCreateKey(HKEY_CLASSES_ROOT, pId, &hKeyNew)))
goto Error1;
wErrMsg = NULL;
Error2:
RegCloseKey(hKeyNew);
Error1:
LocalUnlock(hId);
return(wErrMsg);
}
WORD NEAR PASCAL MyGetClassName(HANDLE hId, HANDLE *hName)
{
WORD wErrMsg;
wErrMsg = GetErrMsg((WORD)MyQueryValue(HKEY_CLASSES_ROOT, LocalLock(hId),
hName));
LocalUnlock(hId);
return(wErrMsg);
}
WORD NEAR PASCAL DeleteClassId(HANDLE hId)
{
WORD wErrMsg;
wErrMsg = GetErrMsg((WORD)RegDeleteKey(HKEY_CLASSES_ROOT, LocalLock(hId)));
LocalUnlock(hId);
return(wErrMsg);
}
WORD NEAR PASCAL MergeData(HWND hWndName, HANDLE hId)
{
HANDLE hName;
HANDLE *phTemp;
WORD wErrMsg = IDS_OUTOFMEMORY;
HKEY hKeyId, hKeyShell, hKeyAction;
int i, j;
if(!(hName=GetEditString(hWndName)))
goto Error2;
if(wErrMsg=GetErrMsg((WORD)RegOpenKey(HKEY_CLASSES_ROOT, LocalLock(hId),
&hKeyId)))
goto Error3;
if(wErrMsg=GetErrMsg((WORD)RegCreateKey(hKeyId, szShell, &hKeyShell)))
goto Error4;
if(wErrMsg=GetErrMsg((WORD)RegSetValue(hKeyId, szNull, (DWORD)REG_SZ,
LocalLock(hName), 0L)))
goto Error5;
for(i=0, phTemp=pLocalVals; i<NUMACTIONS; ++i) {
if(wErrMsg=GetErrMsg((WORD)RegCreateKey(hKeyShell, ppActionIds[i],
&hKeyAction)))
goto Error5;
for(j=0; j<EDITSPERACTION; ++j, ++phTemp) {
if(*phTemp && (j<OFFSET_FIRSTDDE || cUsesDDE[i])) {
PSTR pTemp;
pTemp = LocalLock(*phTemp);
if((j==OFFSET_DDETOPIC && !lstrcmpi(pTemp, szSystem)) ||
(j==OFFSET_DDEAPP && !lstrcmpi(pTemp,
GetAppName(*(phTemp+OFFSET_COMMAND-OFFSET_DDEAPP)))))
RegDeleteKey(hKeyAction, ppCommands[j]);
else
wErrMsg = GetErrMsg((WORD)RegSetValue(hKeyAction, ppCommands[j],
(DWORD)REG_SZ, pTemp, 0L));
LocalUnlock(*phTemp);
if(wErrMsg)
goto Error5;
} else {
RegDeleteKey(hKeyAction, ppCommands[j]);
}
}
RegCloseKey(hKeyAction);
}
wErrMsg = NULL;
Error5:
LocalUnlock(hName);
RegCloseKey(hKeyShell);
Error4:
RegCloseKey(hKeyId);
Error3:
LocalUnlock(hId);
LocalFree(hName);
Error2:
return(wErrMsg);
}
WORD NEAR PASCAL ResetClassList(HWND hWndIdList, HWND hWndNameList)
{
HANDLE hClassId, hClassName;
HKEY hKeyClasses;
int i;
WORD wErrMsg;
/* Reset the name list */
SendMessage(hWndIdList, LB_RESETCONTENT, 0, 0L);
SendMessage(hWndNameList, LB_RESETCONTENT, 0, 0L);
if(wErrMsg=GetErrMsg((WORD)RegCreateKey(HKEY_CLASSES_ROOT, szNull,
&hKeyClasses)))
goto Error1;
for(i=0; MyEnumKey(hKeyClasses, i, &hClassId)==ERROR_SUCCESS && !wErrMsg;
++i) {
int nId;
PSTR pClassId;
pClassId = LocalLock(hClassId);
if(*pClassId=='.' || (wErrMsg=MyGetClassName(hClassId, &hClassName)))
goto Error2;
wErrMsg = IDS_OUTOFMEMORY;
if((nId=(int)SendMessage(hWndNameList, LB_ADDSTRING, 0,
(DWORD)((LPSTR)LocalLock(hClassName))))==LB_ERR
|| SendMessage(hWndIdList, LB_INSERTSTRING, nId,
(DWORD)((LPSTR)pClassId))==LB_ERR)
goto Error3;
wErrMsg = NULL;
Error3:
LocalUnlock(hClassName);
LocalFree(hClassName);
Error2:
LocalUnlock(hClassId);
LocalFree(hClassId);
}
SendMessage(hWndNameList, LB_SETTOPINDEX, 0, 0L);
SendMessage(hWndNameList, LB_SETCURSEL, 0, 0L);
RegCloseKey(hKeyClasses);
Error1:
return(wErrMsg);
}
WORD NEAR PASCAL GetLocalCopies(HWND hWndName, HANDLE hId)
{
HKEY hKeyId, hKeyShell, hSubKey;
HANDLE hName, *phTemp;
WORD wErrMsg = IDS_OUTOFMEMORY;
int i, j;
if(!pLocalVals) {
HANDLE hLocalVals;
if(!(hLocalVals=LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT,
NUMACTIONS*EDITSPERACTION*sizeof(HANDLE)))
|| !(pLocalVals=(HANDLE *)LocalLock(hLocalVals)))
goto Error1;
}
for(i=0, phTemp=pLocalVals; i<NUMACTIONS; ++i) {
cUsesDDE[i] = 0;
for(j=0; j<EDITSPERACTION; ++j, ++phTemp) {
if(*phTemp) {
LocalFree(*phTemp);
*phTemp = NULL;
}
}
}
SendMessage(hWndName, WM_SETTEXT, 0, (DWORD)((LPSTR)szNull));
if(!hId)
return(NULL);
if(wErrMsg=GetErrMsg((WORD)RegOpenKey(HKEY_CLASSES_ROOT, LocalLock(hId),
&hKeyId)))
goto Error3;
if(wErrMsg=GetErrMsg((WORD)RegCreateKey(hKeyId, szShell, &hKeyShell)))
goto Error4;
if(wErrMsg=GetErrMsg((WORD)MyQueryValue(hKeyId, szNull, &hName)))
goto Error5;
SendMessage(hWndName, WM_SETTEXT, 0, (DWORD)((LPSTR)LocalLock(hName)));
LocalUnlock(hName);
LocalFree(hName);
for(i=0, phTemp=pLocalVals; i<NUMACTIONS; ++i) {
if(wErrMsg=GetErrMsg((WORD)RegCreateKey(hKeyShell, ppActionIds[i],
&hSubKey)))
goto Error5;
for(j=0; j<EDITSPERACTION; ++j, ++phTemp) {
if((wErrMsg=(WORD)MyQueryValue(hSubKey, ppCommands[j], phTemp))
!=(WORD)ERROR_BADKEY && (wErrMsg=GetErrMsg(wErrMsg)))
goto Error5;
if(j>=OFFSET_FIRSTDDE) {
if(*phTemp)
cUsesDDE[i] = 1;
else if(j == OFFSET_DDETOPIC) {
*phTemp = StringToLocalHandle(szSystem, LMEM_MOVEABLE);
} else if(j == OFFSET_DDEAPP) {
HANDLE hTemp;
if(hTemp = *(phTemp-(OFFSET_DDEAPP+OFFSET_COMMAND)))
*phTemp = StringToLocalHandle(GetAppName(hTemp),
LMEM_MOVEABLE);
}
}
}
RegCloseKey(hSubKey);
}
wErrMsg = NULL;
Error5:
RegCloseKey(hKeyShell);
Error4:
RegCloseKey(hKeyId);
Error3:
LocalUnlock(hId);
Error1:
return(wErrMsg);
}