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.
 
 
 
 
 
 

389 lines
8.6 KiB

#include <windows.h>
#include "common.h"
#define BLOCKLEN 100
#ifndef DBCS
#define AnsiNext(x) ((x)+1)
#endif
extern HANDLE hInstance;
extern FARPROC lpOldHook;
extern HWND hWndMain, hWndHelp;
extern WORD wHelpMain;
extern char *pszLongName;
extern char *pszOutOfMemory;
HANDLE NEAR PASCAL StringToLocalHandle(LPSTR szStr, WORD wFlags)
{
HANDLE hStr;
LPSTR lpStr;
if(!(hStr=LocalAlloc(wFlags, lstrlen(szStr) + 1)))
goto Error1;
if(!(lpStr=LocalLock(hStr)))
goto Error2;
lstrcpy(lpStr, szStr);
LocalUnlock(hStr);
goto Error1;
Error2:
LocalFree(hStr);
hStr = NULL;
Error1:
return(hStr);
}
LPSTR NEAR _fastcall MyStrTok(LPSTR szList, char cEnd)
{
LPSTR szTemp;
/* if there are no more tokens return NULL */
if(!*szList)
return NULL;
/* find delimiter or end of string */
while(*szList && *szList!=cEnd)
szList = AnsiNext(szList);
/* if we found a delimiter insert string terminator and skip */
if(*szList) {
szTemp = szList;
szList = AnsiNext(szTemp);
*szTemp = '\0';
}
/* return token */
return(szList);
}
int NEAR PASCAL DoDialogBoxParam(LPCSTR lpDialog, HWND hWnd, FARPROC lpfnProc,
DWORD dwParam)
{
int result = -1;
if(!(lpfnProc = MakeProcInstance(lpfnProc, hInstance)))
goto Error1;
result = DialogBoxParam(hInstance, lpDialog, hWnd, lpfnProc, dwParam);
FreeProcInstance(lpfnProc);
Error1:
return(result);
}
int NEAR PASCAL DoDialogBox(LPCSTR lpDialog, HWND hWnd, FARPROC lpfnProc)
{
return(DoDialogBoxParam(lpDialog, hWnd, lpfnProc, 0L));
}
unsigned long NEAR PASCAL MyQueryValue(HKEY hKey, PSTR pSubKey, HANDLE *hBuf)
{
HANDLE hTemp;
PSTR pBuf;
WORD wBufSize = BLOCKLEN;
unsigned long result = ERROR_OUTOFMEMORY;
LONG lSize;
if(!(*hBuf=LocalAlloc(LMEM_MOVEABLE, wBufSize)))
goto Error1;
if(!(pBuf=LocalLock(*hBuf)))
goto Error2;
while((lSize=wBufSize, (result=RegQueryValue(hKey, pSubKey, pBuf, &lSize))
==ERROR_SUCCESS) && (WORD)lSize>wBufSize-10) {
LocalUnlock(*hBuf);
wBufSize += BLOCKLEN;
if(!(hTemp=LocalReAlloc(*hBuf, wBufSize, LMEM_MOVEABLE))) {
result = ERROR_OUTOFMEMORY;
goto Error2;
}
pBuf = LocalLock(*hBuf=hTemp);
}
LocalUnlock(*hBuf);
if(result!=ERROR_SUCCESS || !lSize)
goto Error2;
goto Error1;
Error2:
LocalFree(*hBuf);
*hBuf = NULL;
Error1:
return(result);
}
HANDLE NEAR PASCAL GetEditString(HWND hWndEdit)
{
HANDLE hEdit = NULL;
PSTR pEdit;
WORD wLen;
wLen = LOWORD(SendMessage(hWndEdit, WM_GETTEXTLENGTH, 0, 0L)) + 1;
if(!(hEdit=LocalAlloc(LMEM_MOVEABLE, wLen)))
goto Error1;
if(!(pEdit=LocalLock(hEdit)))
goto Error2;
SendMessage(hWndEdit, WM_GETTEXT, wLen, (DWORD)((LPSTR)pEdit));
LocalUnlock(hEdit);
goto Error1;
Error2:
LocalFree(hEdit);
hEdit = NULL;
Error1:
return(hEdit);
}
HANDLE NEAR _fastcall MyLoadString(WORD wId, WORD *pwSize, WORD wFlags)
{
char szString[258]; /* RC limits strings to 256 chars */
WORD wSize;
wSize = LoadString(hInstance, wId, szString, sizeof(szString));
if(pwSize)
*pwSize = wSize;
return(StringToLocalHandle(szString, wFlags));
}
int NEAR cdecl MyMessageBox(HWND hWnd, WORD wText, WORD wType, WORD wExtra, ...)
{
HANDLE hText, hRText;
PSTR pText, pRText;
WORD wSize;
int result = 0;
if(wText == IDS_OUTOFMEMORY)
goto Error1;
if(!(hText=MyLoadString(wText, &wSize, LMEM_MOVEABLE)))
goto Error1;
/* We allocate enough room for a bunch of numbers and the strings
*/
if(!(hRText=LocalAlloc(LMEM_MOVEABLE, 2*wSize + wExtra)))
goto Error2;
if(!(pRText=LocalLock(hRText)))
goto Error3;
pText = LocalLock(hText);
wvsprintf(pRText, pText, (LPSTR)(&wExtra+1));
result = MessageBox(hWnd, pRText, pszLongName, wType);
LocalUnlock(hText);
LocalUnlock(hRText);
Error3:
LocalFree(hRText);
Error2:
LocalFree(hText);
Error1:
if(!result) {
MessageBox(hWnd, pszOutOfMemory, pszLongName,
MB_ICONHAND | MB_SYSTEMMODAL | MB_OK);
}
return(result);
}
VOID NEAR PASCAL WriteProfileInt(WORD wAppName, WORD wKey, int nVal)
{
HANDLE hAppName, hKey;
char buf[10];
if(!(hAppName=MyLoadString(wAppName, NULL, LMEM_MOVEABLE)))
goto Error1;
if(!(hKey=MyLoadString(wKey, NULL, LMEM_MOVEABLE)))
goto Error2;
wsprintf(buf, "%d", nVal);
WriteProfileString(LocalLock(hAppName), LocalLock(hKey), buf);
LocalUnlock(hKey);
LocalUnlock(hAppName);
Error2:
LocalFree(hKey);
Error1:
LocalFree(hAppName);
}
int NEAR PASCAL MyGetProfileInt(WORD wAppName, WORD wKey, int nDefault)
{
HANDLE hAppName, hKey;
if(!(hAppName=MyLoadString(wAppName, NULL, LMEM_MOVEABLE)))
goto Error1;
if(!(hKey=MyLoadString(wKey, NULL, LMEM_MOVEABLE)))
goto Error2;
nDefault = GetProfileInt(LocalLock(hAppName), LocalLock(hKey), nDefault);
LocalUnlock(hKey);
LocalUnlock(hAppName);
Error2:
LocalFree(hKey);
Error1:
LocalFree(hAppName);
return(nDefault);
}
HANDLE NEAR PASCAL StringToHandle(LPSTR szStr)
{
HANDLE hStr;
LPSTR lpStr;
if(!(hStr=GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE,
(DWORD)(lstrlen(szStr)+1))))
goto Error1;
if(!(lpStr=GlobalLock(hStr)))
goto Error2;
lstrcpy(lpStr, szStr);
GlobalUnlock(hStr);
goto Error1;
Error2:
GlobalFree(hStr);
hStr = NULL;
Error1:
return(hStr);
}
int FAR PASCAL MessageFilter(int nCode, WORD wParam, LPMSG lpMsg)
{
switch(nCode) {
case MSGF_MENU:
case MSGF_DIALOGBOX:
if(lpMsg->message==WM_KEYDOWN && lpMsg->wParam==VK_F1
&& !(lpMsg->lParam&(1L<<30)))
PostMessage(hWndHelp, WM_COMMAND, ID_HELP,
MAKELONG(lpMsg->hwnd, nCode));
break;
default:
DefHookProc(nCode, wParam, (DWORD)lpMsg, &lpOldHook);
return(FALSE);
}
return(FALSE);
}
#ifndef NOHELP
// #define ONLYID
VOID NEAR PASCAL MyHelp(HWND hWnd, WORD wCommand, DWORD wId)
{
#ifdef ONLYID
if(wCommand != HELP_QUIT)
MyMessageBox(hWnd, IDS_HELP, MB_OK, 0, wId);
#else
HANDLE hHelpFile;
PSTR pHelpFile;
if(!(hHelpFile=MyLoadString(wHelpMain==IDW_SDKMAIN ?
IDS_SDKHELPFILE : IDS_HELPFILE, NULL, LMEM_MOVEABLE)))
return;
if(!WinHelp(hWndMain, pHelpFile=LocalLock(hHelpFile), wCommand, wId))
MyMessageBox(hWnd, IDS_HELPERR, MB_OK, 0);
else
WinHelp(hWndMain, pHelpFile, HELP_SETINDEX, wHelpIndex);
LocalUnlock(hHelpFile);
LocalFree(hHelpFile);
#endif
}
#endif
HANDLE NEAR PASCAL GetListboxString(HWND hWndEdit, int nId)
{
HANDLE hEdit = NULL;
PSTR pEdit;
WORD wLen;
wLen = LOWORD(SendMessage(hWndEdit, LB_GETTEXTLEN, nId, 0L)) + 1;
if(!(hEdit=LocalAlloc(LMEM_MOVEABLE, wLen)))
goto Error1;
if(!(pEdit=LocalLock(hEdit)))
goto Error2;
SendMessage(hWndEdit, LB_GETTEXT, nId, (DWORD)((LPSTR)pEdit));
LocalUnlock(hEdit);
goto Error1;
Error2:
LocalFree(hEdit);
hEdit = NULL;
Error1:
return(hEdit);
}
unsigned long NEAR PASCAL MyEnumKey(HKEY hKey, WORD wIndex, HANDLE *hBuf)
{
HANDLE hTemp;
PSTR pBuf;
WORD wBufSize = BLOCKLEN, wSize;
unsigned long result = ERROR_OUTOFMEMORY;
if(!(*hBuf=LocalAlloc(LMEM_MOVEABLE, wBufSize)))
goto Error1;
if(!(pBuf=LocalLock(*hBuf)))
goto Error2;
while((result=RegEnumKey(hKey, wIndex, pBuf, (DWORD)wBufSize))
==ERROR_SUCCESS && (wSize=lstrlen(pBuf))>wBufSize-10) {
LocalUnlock(*hBuf);
wBufSize += BLOCKLEN;
if(!(hTemp=LocalReAlloc(*hBuf, wBufSize, LMEM_MOVEABLE))) {
result = ERROR_OUTOFMEMORY;
goto Error2;
}
pBuf = LocalLock(*hBuf=hTemp);
}
LocalUnlock(*hBuf);
if(result!=ERROR_SUCCESS || !wSize)
goto Error2;
goto Error1;
Error2:
LocalFree(*hBuf);
*hBuf = NULL;
Error1:
return(result);
}
static WORD wErrMsgs[] = {
0, IDS_BADDB, IDS_BADKEY, IDS_CANTOPENDB, IDS_CANTREADDB, IDS_CANTWRITEDB,
IDS_OUTOFMEMORY, IDS_INVALIDPARM
} ;
WORD NEAR _fastcall GetErrMsg(WORD wRet)
{
return(wRet>=sizeof(wErrMsgs)/sizeof(wErrMsgs[0]) ?
IDS_INVALIDPARM : wErrMsgs[wRet]);
}
VOID NEAR PASCAL RepeatMove(LPSTR lpDest, LPSTR lpSrc, WORD wBytes)
{
/* WARNING: This assumes that the buffers are in different segments, or
* the offset of the dest is less than the offset of the src
*/
/* Save DS, and load up ES:DI, DS:SI, and CX with the parameters */
_asm push ds
_asm les di,lpDest
_asm lds si,lpSrc
_asm mov cx,wBytes
_asm cld
/* Do a movsb if CX is odd, and then do movsw for CX/2 */
_asm shr CX,1
_asm jnc repm1
_asm movsb
_asm repm1:
_asm jcxz repm2
_asm rep movsw
_asm repm2:
/* Restore DS and return */
_asm pop ds
}