#include "os2win.h" #include #include #include #include HANDLE hinst; CRITICAL_SECTION HP_cs_mutex; HANDLE HP_event_sem; int main(int argc, char *argv[]) { return(0); } VOID HP_SetHinst(HANDLE h) { hinst = h; return; } LONG HP_gpiCharStringAt(HDC hdc, PPOINTL ppl, int cb, LPCSTR pch) { UINT uintSave; uintSave = GetTextAlign(hdc); SetTextAlign(hdc, uintSave | TA_UPDATECP); MoveToEx(hdc, ppl->x, ppl->y, NULL); TextOut(hdc, 0, 0, pch, cb); SetTextAlign(hdc, uintSave); return(TRUE); } USHORT HP_dosReallocSeg(USHORT usNew, SEL sel) { UINT cb = LocalSize(sel); if ((UINT) usNew > cb) MessageBox(NULL, "Cannot Grow memory with cheater libs.", "OS/2 conversion Error", MB_ICONHAND | MB_OK); return(0); } USHORT HP_dosFreeSeg( SEL sel) { LocalFree(sel); return(0); } USHORT HP_dosAllocSeg( USHORT usSize, PSEL psel, USHORT fs) { if (fs & (SEG_GIVEABLE | SEG_GETTABLE)) MessageBox(NULL, "Give/Get Seg not supported.", "OS/2 conversion Error", MB_ICONHAND | MB_OK); *psel = LocalAlloc(LPTR, (UINT) usSize); return(0); } BOOL HP_winQueryCursorInfo(HWND hd, PCURSORINFO pcsri) { POINT ptl; GetCursorPos(&ptl); pcsri->hwnd = WindowFromPoint(ptl); pcsri->x = ptl.x; pcsri->y = ptl.y; pcsri->cx = 0; // USE Defaults. pcsri->cy = 0; pcsri->fs = 0; // CURSOR_SOLID GetClipCursor(&pcsri->rclClip); return(TRUE); } HWND HP_winQueryWindow(HWND hwnd, SHORT cmd, BOOL b) { switch (cmd) { case QW_NEXT: return(GetNextWindow(hwnd, GW_HWNDNEXT)); break; case QW_PREV: return(GetNextWindow(hwnd, GW_HWNDPREV)); break; case QW_TOP: return(GetTopWindow(hwnd)); break; case QW_BOTTOM: return(GetWindow(GetWindow(hwnd,GW_CHILD), GW_HWNDLAST)); break; case QW_OWNER: return(GetWindow(hwnd, GW_OWNER)); break; case QW_PARENT: return(GetParent(hwnd)); break; case QW_NEXTTOP: return(GetWindow(hwnd, GW_HWNDNEXT)); break; case QW_PREVTOP: return(GetWindow(hwnd, GW_HWNDPREV)); break; default: return(NULL); break; } } HANDLE HP_winQuerySysPointer(HWND hd, SHORT s, BOOL b) { switch(s) { case SPTR_APPICON: LoadIcon(NULL, IDI_APPLICATION); break; case SPTR_ARROW: LoadCursor(NULL, IDC_ARROW); break; case SPTR_ICONERROR: LoadIcon(NULL, IDI_HAND); break; case SPTR_ICONINFORMATION: LoadIcon(NULL, IDI_ASTERISK); break; case SPTR_ICONQUESTION: LoadIcon(NULL, IDI_QUESTION); break; case SPTR_ICONWARNING: LoadIcon(NULL, IDI_EXCLAMATION); break; case SPTR_MOVE: MessageBox(NULL, "No SPTR_MOVE ICON in Windows", "OS/2 conversion Error", MB_ICONHAND | MB_OK); return(NULL); break; case SPTR_SIZENESW: LoadCursor(NULL, IDC_SIZENESW); break; case SPTR_SIZENS: LoadCursor(NULL, IDC_SIZENS); break; case SPTR_SIZENWSE: LoadCursor(NULL, IDC_SIZENWSE); break; case SPTR_SIZEWE: LoadCursor(NULL, IDC_SIZEWE); break; case SPTR_TEXT: LoadCursor(NULL, IDC_IBEAM); break; case SPTR_WAIT: LoadCursor(NULL, IDC_WAIT); break; } } USHORT HP_dosChgFilePtr(HANDLE h, LONG l, USHORT M, PULONG pul) { DWORD dw; dw = SetFilePointer(h, l, NULL, M); if (pul) *pul = SetFilePointer(h, l, NULL, M); return( (dw) ? 0 : -1); } VOID HP_dosExit( USHORT usF, USHORT usC) { if (usF == EXIT_THREAD) ExitThread(usC); MessageBox(NULL, "Exited Process with DosExit", "Poss. OS/2 conversion Error", MB_ICONHAND | MB_OK); ExitProcess(usC); } USHORT HP_dosQHandType( HANDLE h, PULONG pul, PUSHORT pus) { DWORD dw = GetFileType(h); if (pul) *pul = dw; return( (dw) ? 0 : -1); } USHORT HP_dosQFileMode( PSZ psz, PULONG pul, DWORD d) { DWORD dw = GetFileAttributes(psz); if (pul) *pul = dw; return( (dw) ? 0 : -1); } USHORT HP_dosGetProcAddress( HANDLE h, PSZ psz, PPFN pul) { FARPROC dw = GetProcAddress(h, psz); if (pul) *pul = dw; return( (dw) ? 0 : -1); } DWORD HP_dosMakeNmPipe(PSZ pszName, PHPIPE php, USHORT fsOpenMode, USHORT fsPipeMode, USHORT cbOutBuf, USHORT cbInBuf, DWORD ulTimeOut) { *php = CreateNamedPipe( pszName, fsOpenMode, fsPipeMode, 1L, cbOutBuf, cbInBuf, ulTimeOut, NULL); if (*php != NULL) return(0); else return(GetLastError()); } DWORD HP_dosOpen(PSZ pszFileName, PHANDLE phf, PUSHORT pusAction, ULONG ulFileSize, USHORT usAttribute, USHORT fsOpenFlags, USHORT fsOpenMode, ULONG ul) { DWORD fdwAccess, fdwShareMode, fdwCreate, fdwAttr; USHORT usTmp; SECURITY_ATTRIBUTES sa; fdwAccess = fdwShareMode = fdwCreate = 0L; if (fsOpenFlags == FILE_CREATE) fdwAccess = CREATE_NEW; if (fsOpenFlags == FILE_OPEN) fdwAccess = OPEN_EXISTING; if (fsOpenFlags == FILE_TRUNCATE) fdwAccess = TRUNCATE_EXISTING; if (fsOpenFlags == (FILE_CREATE | FILE_TRUNCATE)) fdwAccess = CREATE_ALWAYS; if (fsOpenFlags == (FILE_CREATE | FILE_OPEN)) fdwAccess = OPEN_ALWAYS; if (fsOpenMode & OPEN_ACCESS_WRITEONLY) fdwAccess = GENERIC_WRITE; else if (fsOpenMode & OPEN_ACCESS_READWRITE) fdwAccess = GENERIC_WRITE | GENERIC_READ; else fdwAccess = GENERIC_READ; fdwAttr = (DWORD) usAttribute; if (fsOpenMode & OPEN_FLAGS_WRITE_THROUGH) fdwAttr |= FILE_FLAG_WRITE_THROUGH; if (fsOpenMode & OPEN_FLAGS_NO_CACHE) fdwAttr |= FILE_FLAG_NO_BUFFERING; if (fsOpenMode & OPEN_FLAGS_SEQUENTIAL) fdwAttr |= FILE_FLAG_SEQUENTIAL_SCAN; if (fsOpenMode & OPEN_FLAGS_RANDOM) fdwAttr |= FILE_FLAG_RANDOM_ACCESS; usTmp = fsOpenMode & 0x0070; if (usTmp == OPEN_SHARE_DENYREAD) fdwShareMode = FILE_SHARE_WRITE; if (usTmp == OPEN_SHARE_DENYWRITE) fdwShareMode = FILE_SHARE_READ; if (usTmp == OPEN_SHARE_DENYNONE) fdwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; if (fsOpenMode & OPEN_FLAGS_NOINHERIT) sa.bInheritHandle = FALSE; else sa.bInheritHandle = TRUE; *phf = CreateFile( pszFileName, fdwAccess, fdwShareMode, &sa, fdwCreate, fdwAttr, NULL); if (*phf != NULL) return(0); else return(GetLastError()); } USHORT HP_dosQCurDir(USHORT usDriveNum, PSZ pszPath, PUSHORT pcb) { char chCurrent[MAX_PATH], chOther[MAX_PATH]; char ch; USHORT usCurrent; GetCurrentDirectory(MAX_PATH, chCurrent); ch = toupper(chCurrent[0]); usCurrent = (char) ((0x007F & ch) - (0x007F & 'A') + 1); if (usDriveNum == 0 || usDriveNum == usCurrent) strcpy( chOther, chCurrent); else { strcpy( chOther, "A:"); ch = usDriveNum + (0x007F & 'A') - 1; chOther[0] = ch; SetCurrentDirectory(chOther); GetCurrentDirectory(MAX_PATH, chOther); SetCurrentDirectory(chCurrent); } if ((strlen(chOther) - 1) > *pcb) return(ERROR_BUFFER_OVERFLOW); else { strcpy( pszPath, &chOther[2]); return(0); } } USHORT HP_dosQCurDisk(PUSHORT pusDriveNum, PULONG pul) { char chCurrent[MAX_PATH]; char ch; GetCurrentDirectory(MAX_PATH, chCurrent); ch = toupper(chCurrent[0]); *pusDriveNum = (0x007F & ch) - (0x007F & 'A') + 1; *pul = GetLogicalDrives(); return(0); } USHORT HP_dosSelectDisk(USHORT usDriveNum) { char chOther[MAX_PATH]; char ch; strcpy( chOther, "A:"); ch = (char)(usDriveNum + (0x007F & 'A') - 1); chOther[0] = ch; SetCurrentDirectory(chOther); return(0); } HFONT HP_SimpleFont( LPCTSTR szFaceName, LONG size, LONG width, DWORD fs) { LOGFONT lf; lf.lfHeight = size; lf.lfWidth = width; lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfWeight = (fs & FATTR_SEL_BOLD) ? FW_BOLD : FW_NORMAL; lf.lfItalic = (fs & FATTR_SEL_ITALIC) ? TRUE : FALSE; lf.lfUnderline = (fs & FATTR_SEL_UNDERSCORE) ? TRUE : FALSE; lf.lfStrikeOut = (fs & FATTR_SEL_STRIKEOUT) ? TRUE : FALSE; lf.lfCharSet = ANSI_CHARSET; lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; strcpy( lf.lfFaceName, szFaceName); return(CreateFontIndirect(&lf)); } void HP_RegisterClass(LPCTSTR pszClassName, PFN pfn, DWORD fs, int cb) { WNDCLASS wc; ATOM aClass; wc.lpfnWndProc = (WNDPROC) pfn; wc.cbClsExtra = 0; wc.cbWndExtra = cb; wc.hInstance = hinst; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1); wc.lpszMenuName = NULL; wc.lpszClassName = pszClassName; wc.style = 0; wc.style |= (fs & HP_CS_SAVEBITS) ? CS_SAVEBITS : 0; wc.style |= (fs & HP_CS_SIZEREDRAW) ? (CS_HREDRAW | CS_VREDRAW) : 0; aClass = RegisterClass(&wc); if (aClass == 0x0000) fprintf( stderr, "RegisterClass Failure! \n" ); } HWND HP_CreateStdWindow(HWND hwndParent, DWORD flStyle1, LPDWORD pflStyle2, LPCTSTR pszClass, LPCTSTR pszTitle, DWORD flStyle3, HMODULE hmod, DWORD lpv, PHWND phwndClient) { DWORD dwStyle = 0; HWND hwnd; DWORD flStyle2 = (pflStyle2) ? *pflStyle2 : 0; HMENU hMenu; flStyle1 |= flStyle3; dwStyle |= (flStyle1 & HP_FS_DLGBORDER ) ? WS_BORDER : 0; dwStyle |= (flStyle1 & HP_FS_BORDER ) ? WS_BORDER : 0; dwStyle |= (flStyle1 & HP_FS_SIZEBORDER ) ? WS_THICKFRAME : 0; dwStyle |= (flStyle1 & HP_FS_STANDARD ) ? WS_OVERLAPPEDWINDOW : 0; dwStyle |= (flStyle1 & HP_WS_VISIBLE ) ? WS_VISIBLE : 0; dwStyle |= (flStyle1 & HP_WS_DISABLED ) ? WS_DISABLED : 0; dwStyle |= (flStyle1 & HP_WS_CLIPCHILDREN ) ? WS_CLIPCHILDREN : 0; dwStyle |= (flStyle1 & HP_WS_CLIPSIBLINGS ) ? WS_CLIPSIBLINGS : 0; dwStyle |= (flStyle1 & HP_WS_MINIMIZED ) ? WS_MINIMIZE : 0; dwStyle |= (flStyle1 & HP_WS_MAXIMIZED ) ? WS_MAXIMIZE : 0; dwStyle |= (flStyle1 & HP_WS_GROUP ) ? WS_GROUP : 0; dwStyle |= (flStyle1 & HP_WS_TABSTOP ) ? WS_TABSTOP : 0; dwStyle |= (flStyle2 & HP_FCF_TITLEBAR ) ? WS_CAPTION : 0; dwStyle |= (flStyle2 & HP_FCF_SYSMENU ) ? WS_SYSMENU : 0; dwStyle |= (flStyle2 & HP_FCF_SIZEBORDER ) ? WS_THICKFRAME : 0; dwStyle |= (flStyle2 & HP_FCF_MINBUTTON ) ? WS_MINIMIZEBOX : 0; dwStyle |= (flStyle2 & HP_FCF_MAXBUTTON ) ? WS_MAXIMIZEBOX : 0; dwStyle |= (flStyle2 & HP_FCF_VERTSCROLL ) ? WS_VSCROLL : 0; dwStyle |= (flStyle2 & HP_FCF_HORZSCROLL ) ? WS_HSCROLL : 0; dwStyle |= (flStyle2 & HP_FCF_DLGBORDER ) ? WS_BORDER : 0; dwStyle |= (flStyle2 & HP_FCF_BORDER ) ? WS_BORDER : 0; dwStyle |= (flStyle2 & HP_FCF_STANDARD ) ? WS_OVERLAPPED : 0; hMenu = LoadMenu(hinst, MAKEINTRESOURCE(lpv)); try { hwnd = CreateWindow(pszClass, pszTitle, dwStyle, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwndParent, hMenu, hinst, NULL); } except( EXCEPTION_EXECUTE_HANDLER) { fprintf( stderr, "CreateWindow Exception %ld\n", GetExceptionCode()); } if (phwndClient) *phwndClient = hwnd; return(hwnd); } UINT HP_Message(HWND hwnd, UINT msg, WPARAM mp1, LPARAM mp2, UINT fSend) { WPARAM wParam = mp1; LPARAM lParam = mp2; UINT uRet; switch(msg) { case WM_SETICON: SetClassLong(hwnd, GCL_HICON, mp1); return(TRUE); break; case HP_SBM_SETPOS: // Assume Vertical scroll bar. SetScrollPos(hwnd, SB_VERT, LOWORD(mp1), TRUE); return(TRUE); break; case HP_SBM_SETSCROLLBAR: SetScrollRange(hwnd, SB_VERT, LOWORD(mp2), HIWORD(mp2), FALSE); SetScrollPos(hwnd, SB_VERT, LOWORD(mp1), TRUE); return(TRUE); break; case HP_SBM_QUERYPOS: return(GetScrollPos(hwnd, SB_VERT)); case HP_SBM_QUERYRANGE: { DWORD dwLow, dwHigh; GetScrollRange(hwnd, SB_VERT, &dwLow, &dwHigh); return(MAKELONG(LOWORD(dwLow),LOWORD(dwHigh))); } case WM_CHAR: { PACKED_LONG pl; pl.dw = 0; wParam = 0x000000FF & CHAR1FROMMP(mp2); pl.shl = CHAR3FROMMP(mp1); pl.ch[2] = CHAR4FROMMP(mp1); lParam = pl.dw; } break; case MM_SETITEMATTR: { USHORT idItem = LOWORD(mp1); USHORT usChg = LOWORD(mp2); USHORT usFlags = HIWORD(mp2); if (usChg & HP_MIA_CHECKED) { CheckMenuItem(GetMenu(hwnd), idItem, (usFlags & HP_MIA_CHECKED) ? MF_CHECKED : MF_UNCHECKED); } if (usChg & HP_MIA_HILITED) { HiliteMenuItem(hwnd, GetMenu(hwnd), idItem, (usFlags & HP_MIA_HILITED) ? MF_HILITE : MF_UNHILITE); } if (usChg & HP_MIA_DISABLED) { CheckMenuItem(GetMenu(hwnd), idItem, (usFlags & HP_MIA_DISABLED) ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED); } } break; default: break; } if (fSend) uRet = SendMessage(hwnd,msg,wParam,lParam); else uRet = PostMessage(hwnd,msg,wParam,lParam); return(uRet); } UINT HP_DlgItemMessage(HWND hwnd, int idDlg, UINT msg, WPARAM mp1, LPARAM mp2) { WPARAM wParam = mp1; LPARAM lParam = mp2; UINT uRet; switch(msg) { case HP_LB_GETTEXT: wParam = LOWORD(mp1); break; case HP_BM_GETSTATE: // They just want the hilite! { UINT uState = SendDlgItemMessage(hwnd,idDlg,msg,wParam,lParam); return((uState & 0x0004) ? TRUE : FALSE); } case HP_EM_GETMODIFY: uRet = SendDlgItemMessage(hwnd,idDlg,msg,0,0); SendDlgItemMessage(hwnd,idDlg, EM_SETMODIFY, FALSE, 0); return(uRet); case HP_EM_GETSEL: { DWORD dwLow, dwHigh; SendDlgItemMessage(hwnd,idDlg,msg,(DWORD)&dwLow,(DWORD)&dwHigh); return(MAKELONG(LOWORD(dwLow),LOWORD(dwHigh))); } case HP_EM_SETSEL: wParam = LOWORD(mp1); lParam = HIWORD(mp1); break; case HP_MLM_QUERYSEL: { DWORD dwLow, dwHigh; SendDlgItemMessage(hwnd,idDlg,msg,(DWORD)&dwLow,(DWORD)&dwHigh); switch( mp1) { case MLFQS_MINMAXSEL: return(MAKELONG(LOWORD(dwLow),LOWORD(dwHigh))); case MLFQS_CURSORSEL: // Incorrect, but we'll live. case MLFQS_ANCHORSEL: case MLFQS_MINSEL: return(dwLow); case MLFQS_MAXSEL: return(dwHigh); default: return(0); } } break; case HP_LB_SELITEMRANGE: wParam = mp2; lParam = MAKELONG(LOWORD(mp1),LOWORD(mp1)); break; case HP_LM_SETITEMTEXT: SendDlgItemMessage(hwnd,idDlg,LB_DELETESTRING,LOWORD(mp1),0); SendDlgItemMessage(hwnd,idDlg,LB_INSERTSTRING,LOWORD(mp1),0); return(TRUE); default: break; } uRet = SendDlgItemMessage(hwnd,idDlg,msg,wParam,lParam); return(uRet); } int HP_IsPtr( LPVOID lpv) { char ch; int bPtr = TRUE; try { ch = *((char *) lpv); } except (EXCEPTION_EXECUTE_HANDLER) { bPtr = FALSE; } return(bPtr); } #define HP_RAM_SEM(lpv) ((LPDWORD)(lpv)) #define HP_VALID_RAM_SEM(lpv) (*(HP_RAM_SEM(lpv)) == 0 || *(HP_RAM_SEM(lpv)) == 1) DWORD HP_dosCreateSem(int bExclusive, LPHANDLE lph, LPCTSTR lpch) { char chName[256]; strcpy( chName, "sem_"); lpch += 5; // Skip over leading "\sem\" strcat( chName, lpch); *lph = CreateSemaphore(NULL, 1, 1, chName); return( (*lph) ? 0 : GetLastError()); } DWORD HP_dosOpenSem( LPHANDLE lph, LPCTSTR lpch, DWORD dwAccess) { char chName[256]; strcpy( chName, "sem_"); lpch += 5; // Skip over leading "\sem\" strcat( chName, lpch); *lph = OpenSemaphore(dwAccess, TRUE, chName); return( (*lph) ? 0 : GetLastError()); } USHORT HP_dosSemClear(HANDLE lpv) { DWORD dw; if (HP_IsPtr((LPVOID)lpv) && HP_VALID_RAM_SEM(lpv)) { EnterCriticalSection(&HP_cs_mutex); dw = *(HP_RAM_SEM(lpv)); *(HP_RAM_SEM(lpv)) = 1; if (dw != 1) { // This should release all waiting threads SetEvent(HP_event_sem); // Reclose the door. I assume everyone is free. ResetEvent(HP_event_sem); } LeaveCriticalSection(&HP_cs_mutex); return(0); } } USHORT HP_dosSemSet(HANDLE lpv) { if (HP_IsPtr((LPVOID)lpv) && HP_VALID_RAM_SEM(lpv)) { EnterCriticalSection(&HP_cs_mutex); *(HP_RAM_SEM(lpv)) = 0; LeaveCriticalSection(&HP_cs_mutex); return(0); } } USHORT HP_dosSemWait(HANDLE lpv, DWORD lTimeOut) { DWORD dw; DWORD dwRet; DWORD dwRet2; if (HP_IsPtr((LPVOID)lpv) && HP_VALID_RAM_SEM(lpv)) { EnterCriticalSection(&HP_cs_mutex); dw = *(HP_RAM_SEM(lpv)); while (dw == 0) { LeaveCriticalSection(&HP_cs_mutex); // Warning, timeout reset on every loop! dwRet = WaitForSingleObject(HP_event_sem, lTimeOut); if (dwRet) return((USHORT) dwRet); EnterCriticalSection(&HP_cs_mutex); dw = *(HP_RAM_SEM(lpv)); } LeaveCriticalSection(&HP_cs_mutex); return(0); } else { do { dwRet = WaitForSingleObject(lpv, lTimeOut); dwRet2 = ReleaseSemaphore(lpv, 1, NULL); } while (dwRet2 == FALSE); } } USHORT HP_dosSemRequest(HANDLE lpv, DWORD lTimeOut) { DWORD dw; DWORD dwRet; if (HP_IsPtr((LPVOID)lpv) && HP_VALID_RAM_SEM(lpv)) { EnterCriticalSection(&HP_cs_mutex); dw = *(HP_RAM_SEM(lpv)); while (dw == 0) { LeaveCriticalSection(&HP_cs_mutex); // Warning, timeout reset on every loop! dwRet = WaitForSingleObject(HP_event_sem, lTimeOut); if (dwRet) return((USHORT) dwRet); EnterCriticalSection(&HP_cs_mutex); dw = *(HP_RAM_SEM(lpv)); } *(HP_RAM_SEM(lpv)) = 0; LeaveCriticalSection(&HP_cs_mutex); return(0); } else { return((USHORT) WaitForSingleObject(lpv, lTimeOut)); } } #define MAX_SEARCH 16 int iNumSearches = -1; typedef struct _ff { HANDLE hSearch; DWORD dwAttr; } HP_FIND; HP_FIND hp_fSearches[MAX_SEARCH + 1]; DWORD HP_dosFindFirst(LPTSTR pszSpec, LPDWORD ph, USHORT usAttr, LPWIN32_FIND_DATA lpdata, USHORT usBufLen, PUSHORT pusCount) { int iCreate = (int) *ph; HANDLE hFind; DWORD dwAttr = (DWORD) usAttr; int iMax = *pusCount; int ii = 0; BOOL bOk = TRUE; if (iNumSearches == -1) { for (ii = 0; ii < (MAX_SEARCH + 1); ii++) hp_fSearches[ii].hSearch = NULL; ii = 0; iNumSearches = 0; } if (sizeof(WIN32_FIND_DATA) * iMax > (DWORD) usBufLen) iMax = usBufLen / sizeof(WIN32_FIND_DATA); if (iCreate == HDIR_SYSTEM && hp_fSearches[MAX_SEARCH].hSearch != NULL) { CloseHandle(hp_fSearches[MAX_SEARCH].hSearch); hp_fSearches[MAX_SEARCH].hSearch = NULL; } else if ( iNumSearches == MAX_SEARCH) { return(0xFFFF); // SHOULD be ERROR_NO_MORE_SEARCH_HANDLES } if (dwAttr == 0) dwAttr = FILE_ATTRIBUTE_NORMAL; hFind = FindFirstFile( pszSpec, lpdata); if (hFind == NULL) return(GetLastError()); while (bOk && (ii < iMax)) { if (lpdata->dwFileAttributes & dwAttr) { ii++; lpdata++; } bOk = FindNextFile (hFind, lpdata); if (bOk == FALSE && GetLastError() == ERROR_NO_MORE_FILES && ii == 0) return(ERROR_NO_MORE_FILES); } *pusCount = ii; if (iCreate == HDIR_SYSTEM) { hp_fSearches[MAX_SEARCH].hSearch = hFind; hp_fSearches[MAX_SEARCH].dwAttr = dwAttr; *ph = MAX_SEARCH; } else { for (ii = 0; ii < MAX_SEARCH && hp_fSearches[ii].hSearch != NULL; ii++) ; hp_fSearches[ii].hSearch = hFind; hp_fSearches[ii].dwAttr = dwAttr; *ph = ii; iNumSearches++; } return(0); } USHORT HP_dosFindNext(DWORD dw, LPWIN32_FIND_DATA lpdata, USHORT usBufLen, PUSHORT pusCount) { HANDLE hFind; DWORD dwAttr; int iMax = *pusCount; int ii = 0; BOOL bOk = TRUE; if (sizeof(WIN32_FIND_DATA) * iMax > (DWORD) usBufLen) iMax = usBufLen / sizeof(WIN32_FIND_DATA); if (dw < 0 || dw > (MAX_SEARCH + 1)) return(ERROR_INVALID_HANDLE); hFind = hp_fSearches[dw].hSearch; dwAttr = hp_fSearches[dw].dwAttr; do { bOk = FindNextFile (hFind, lpdata); if (bOk == FALSE && GetLastError() == ERROR_NO_MORE_FILES && ii == 0) return(ERROR_NO_MORE_FILES); if (lpdata->dwFileAttributes & dwAttr) { ii++; lpdata++; } } while (bOk && (ii < iMax)); *pusCount = ii; return(0); } USHORT HP_dosFindClose(DWORD dw) { if (dw < 0 || dw > (MAX_SEARCH + 1)) return(ERROR_INVALID_HANDLE); CloseHandle(hp_fSearches[dw].hSearch); hp_fSearches[dw].hSearch = NULL; if (dw != MAX_SEARCH) iNumSearches--; return(0); } DWORD HP_dosNewSize(HANDLE h, DWORD dwSize) { DWORD dwCurrent; dwCurrent = SetFilePointer(h, 0, NULL, FILE_CURRENT); if (dwCurrent == NEG_ONE) return(GetLastError()); SetFilePointer(h, dwSize, NULL, FILE_CURRENT); SetEndOfFile(h); SetFilePointer(h, dwCurrent, NULL, FILE_BEGIN); return(0); } DWORD HP_dosFileLocks(HANDLE h, PFILELOCK pfUnlock, PFILELOCK pfLock) { BOOL bOk = TRUE; if (pfUnlock) bOk = UnlockFile(h, pfUnlock->lOffset, 0, pfUnlock->lRange, 0); if (bOk == FALSE) return(GetLastError()); if (pfLock) bOk = LockFile(h, pfLock->lOffset, 0, pfLock->lRange, 0); if (bOk == FALSE) return(GetLastError()); return(0); } DWORD HP_dosMakePipe( LPHANDLE lpR, LPHANDLE lpW, USHORT us) { return( CreatePipe(lpR, lpW, NULL, (DWORD) us) ? 0 : GetLastError()); } HP_dosError(USHORT f) { UINT ufError = 0; if (f == HARDERROR_ENABLE) ufError = SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX; SetErrorMode(ufError); return(0); } HP_dosLoadModule( LPCTSTR lpName, LPHANDLE ph) { if (ph) *ph = LoadLibrary(lpName); else return(1); return(0); } HP_dosGetModHandle( LPCTSTR lpName, LPHANDLE ph) { if (ph == NULL) return(-1); return( (*ph = GetModuleHandle(lpName)) ? 0 : GetLastError()); } HWND HP_winWindowFromID( HWND hwnd, USHORT usID) { int id = usID; switch (id) { case FID_HORZSCROLL: case FID_VERTSCROLL: case FID_TITLEBAR: case FID_MINMAX: MessageBox(NULL, "Window Controls are not independent Windows", "OS/2 conversion Error", MB_ICONHAND | MB_OK); // FALL THRU case FID_CLIENT: return(hwnd); case FID_MENU: return((HWND) GetMenu(hwnd)); case FID_SYSMENU: return((HWND) GetSystemMenu(hwnd, FALSE)); default: return(GetDlgItem(hwnd, id)); } } BOOL HP_Entry (HANDLE hDLL, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: InitializeCriticalSection(&HP_cs_mutex); HP_event_sem = CreateEvent(NULL, TRUE, FALSE, NULL); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: DeleteCriticalSection(&HP_cs_mutex); CloseHandle(HP_event_sem); break; } return TRUE; UNREFERENCED_PARAMETER(hDLL); UNREFERENCED_PARAMETER(lpReserved); }