Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

378 lines
8.6 KiB

/*
| Outside In for Windows
| Source File OIXPROC.C (Hexadecimal file dump window procedure)
|
| ²²²²² ²²²²²
| ² ² ²
| ² ² ²
| ² ² ²
| ²²²²² ²²²²²
|
| Outside In
|
*/
/*
| Creation Date: 6/27/91
| Original Programmer: Ed Steinweg
|
| Modified: 3/4/94 Joe Keslin
|
|
|
*/
#include <platform.h>
#include <sccut.h>
#include <sccvw.h>
#include <sccd.h>
#include "oix.h"
#include "oix.pro"
#ifdef WINNT
BOOL APIENTRY LibMain( HANDLE hInstance, DWORD dwReason, LPVOID lpReserved )
{
return(TRUE);
}
#endif
DE_ENTRYSC DE_LRESULT DE_ENTRYMOD DEProc( message, wParam, lParam, lpHexInfo )
DE_MESSAGE message;
DE_WPARAM wParam;
DE_LPARAM lParam;
LPOIHEXINFO lpHexInfo;
{
LONG locRet;
HDC hdc;
RECT rc;
DWORD dwRetCount;
IOERR IOErr;
locRet = 0;
switch (message)
{
case SCCD_LOADDE:
break;
case SCCD_UNLOADDE:
break;
case SCCD_GETINFO:
switch (wParam)
{
case SCCD_GETVERSION:
locRet = SCCD_CURRENTVERSION;
break;
case SCCD_GETGENINFOSIZE:
locRet = sizeof(SCCDGENINFO);
break;
case SCCD_GETDISPLAYINFOSIZE:
locRet = sizeof(OIHEXINFO);
break;
case SCCD_GETDISPLAYTYPE:
locRet = MAKELONG(0,SCCD_HEX);
break;
case SCCD_GETFUNCTIONS:
locRet = 0;
break;
case SCCD_GETOPTIONS:
locRet = 0;
break;
case SCCD_GETNAME:
locRet = SCCID_HEXDENAME;
break;
default:
locRet = 0;
}
break;
case SCCD_GETDECOUNT:
return 1;
case SCCD_GETPOSITIONSIZE:
return ( 2 );
break;
case SCCD_OPENDISPLAY:
{
TEXTMETRIC tm;
LPSTR lpBuffer;
OIHOpenDisplay(lpHexInfo);
/* Get size of file and maximum number of lines */
IOErr = IOSeek ( lpHexInfo->hiGen.hFile, IOSEEK_BOTTOM, 0 );
if ( IOErr == IOERR_OK )
IOErr = IOTell ( lpHexInfo->hiGen.hFile, &lpHexInfo->lFileLength );
IOErr = IOSeek ( lpHexInfo->hiGen.hFile, IOSEEK_TOP, 0 );
lpHexInfo->nMaxLines = lpHexInfo->lFileLength / ASCII_WIDTH;
if ( (lpHexInfo->lFileLength % ASCII_WIDTH) )
lpHexInfo->nMaxLines++;
lpBuffer = UTGlobalLock(lpHexInfo->hXDumpBuff);
/* Fill Buffer */
IOErr = IORead ( lpHexInfo->hiGen.hFile, lpBuffer, BUFFER_SIZE, &dwRetCount );
UTGlobalUnlock(lpHexInfo->hXDumpBuff);
/* Get Font height and width */
//JKxxx MOVE TO NP CODE LATER
hdc = GetDC(lpHexInfo->hiGen.hWnd);
SelectObject(hdc, GetStockObject(ANSI_FIXED_FONT));
GetTextMetrics(hdc, &tm);
lpHexInfo->SCCScrollInfo.cxChar = (SHORT)tm.tmAveCharWidth;
lpHexInfo->SCCScrollInfo.cyChar = (SHORT)(tm.tmHeight + tm.tmExternalLeading);
ReleaseDC(lpHexInfo->hiGen.hWnd, hdc);
/* Set range of Vertical Scroll Bar. It will always be fixed. */
DUSetHScrollPos( lpHexInfo, 0 );
DUEnableHScroll( lpHexInfo, 1 );
DUSetVScrollPos( lpHexInfo, 0 );
DUEnableVScroll( lpHexInfo, 1 );
DUSetVScrollRange( lpHexInfo, 0, MAX_VSCROLL );
/* Set positions of Scroll Bars */
DUGetDisplayRect(lpHexInfo, (LPRECT) &rc);
OIHSetScrollPos(lpHexInfo, (SHORT)(rc.right-rc.left), (SHORT)(rc.bottom-rc.top));
}
break;
case SCCD_CLOSEDISPLAY:
OIHCloseDisplay(lpHexInfo);
break;
case SCCD_CLOSEFATAL:
OIHCloseDisplay(lpHexInfo);
break;
case SCCD_SIZE:
{
RECT FAR *pRect;
pRect = (RECT FAR *)(lParam);
OIHSetScrollPos(lpHexInfo, (SHORT)(pRect->right - pRect->left), (SHORT)(pRect->bottom - pRect->top) );
DUInvalRect( lpHexInfo, NULL );
}
break;
case SCCD_VSCROLL:
OIHHandleVScroll(lpHexInfo,(WORD)wParam,lParam);
return(0);
case SCCD_HSCROLL:
OIHHandleHScroll(lpHexInfo,(WORD)wParam,lParam);
return(0);
case SCCD_KEYDOWN:
switch( wParam )
{
case SCCD_KPAGEUP: // Page up.
OIHHandleVScroll( lpHexInfo, SCCD_VPAGEUP, 0L );
return 0;
case SCCD_KPAGEDOWN: // Page down.
OIHHandleVScroll( lpHexInfo, SCCD_VPAGEDOWN, 0L );
return 0;
case SCCD_KUP:
OIHHandleVScroll( lpHexInfo, SCCD_VUP, 0L );
return 0;
case SCCD_KDOWN:
OIHHandleVScroll( lpHexInfo, SCCD_VDOWN, 0L );
return 0;
case SCCD_KRIGHT:
OIHHandleHScroll( lpHexInfo, SCCD_HRIGHT, 0L );
return 0;
case SCCD_KLEFT:
OIHHandleHScroll( lpHexInfo, SCCD_HLEFT, 0L );
return 0;
case SCCD_KHOME:
OIHHandleHScroll( lpHexInfo, SCCD_HPOSITION, 0L );
OIHHandleVScroll( lpHexInfo, SCCD_VPOSITION, 0L );
return 0;
case SCCD_KEND:
OIHHandleHScroll( lpHexInfo, SCCD_HPOSITION, 0L );
OIHHandleVScroll( lpHexInfo, SCCD_VPOSITION, MAKELONG(MAX_VSCROLL,0) );
return 0;
}
break;
case SCCD_UPDATE:
#ifdef WINDOWS
{
LPRECT lpRect;
LONG nPaintBeg, nPaintEnd, nLine;
BYTE HexColOne[HEX_LINE];
BYTE HexColTwo[HEX_LINE];
BYTE AsciiCol[ASCII_LINE];
lpRect = (LPRECT)lParam;
hdc = lpHexInfo->hiGen.hDC;
/* Calculate the boundaries of the lines that need painting */
nPaintBeg = max(0L, lpHexInfo->SCCScrollInfo.nVscrollPos +
(LONG) (lpRect->top / lpHexInfo->SCCScrollInfo.cyChar) - 1L);
nPaintEnd = min(lpHexInfo->nMaxLines, lpHexInfo->SCCScrollInfo.nVscrollPos +
(LONG) (lpRect->bottom / lpHexInfo->SCCScrollInfo.cyChar) + 1L);
/* Paint Lines */
SelectObject(hdc, GetStockObject(OEM_FIXED_FONT));
SetBkMode(hdc,TRANSPARENT);
for ( nLine = nPaintBeg; nLine < nPaintEnd; nLine++ )
{
OIHBuildDumpLine(lpHexInfo, nLine, HexColOne, HexColTwo, AsciiCol);
OIHPaintDumpLine(hdc, lpHexInfo, nLine, HexColOne, HexColTwo, AsciiCol);
}
}
#endif
break;
#ifdef WINDOWS
default:
return(DefWindowProc(lpHexInfo->hiGen.hWnd, message, wParam, lParam));
#endif
}
return (locRet);
}
BOOL OIHOpenDisplay(lpHexInfo)
LPOIHEXINFO lpHexInfo;
{
HANDLE hBuffer;
hBuffer = UTGlobalAlloc(BUFFER_SIZE + 1);
if (hBuffer == NULL)
{
return(FALSE);
}
lpHexInfo->hXDumpBuff = hBuffer;
return(TRUE);
}
VOID OIHCloseDisplay(lpHexInfo)
LPOIHEXINFO lpHexInfo;
{
if (lpHexInfo->hXDumpBuff)
UTGlobalFree(lpHexInfo->hXDumpBuff);
}
VOID OIHHandleHScroll(lpHexInfo,wParam,lParam)
LPOIHEXINFO lpHexInfo;
WORD wParam;
DWORD lParam;
{
SHORT nHscrollInc;
switch (wParam)
{
case SCCD_HRIGHT:
nHscrollInc = 1;
break;
case SCCD_HLEFT:
nHscrollInc = -1;
break;
case SCCD_HPAGERIGHT:
nHscrollInc = ASCII_WIDTH;
break;
case SCCD_HPAGELEFT:
nHscrollInc = -ASCII_WIDTH;
break;
case SCCD_HPOSITION:
nHscrollInc = LOWORD(lParam) - lpHexInfo->SCCScrollInfo.nHscrollPos;
break;
default:
nHscrollInc = 0;
break;
}
/* Make sure window is not going to be scrolled past the first or last character */
if ( nHscrollInc = max(-lpHexInfo->SCCScrollInfo.nHscrollPos,
min(nHscrollInc, lpHexInfo->SCCScrollInfo.nHscrollMax - lpHexInfo->SCCScrollInfo.nHscrollPos)) )
{
lpHexInfo->SCCScrollInfo.nHscrollPos += nHscrollInc;
DUScrollDisplay(lpHexInfo, -(SHORT)(lpHexInfo->SCCScrollInfo.cxChar * nHscrollInc), 0, NULL);
DUSetHScrollPos(lpHexInfo, lpHexInfo->SCCScrollInfo.nHscrollPos);
}
}
VOID OIHHandleVScroll(lpHexInfo,wParam,lParam)
LPOIHEXINFO lpHexInfo;
WORD wParam;
DWORD lParam;
{
LONG nVscrollInc;
switch (wParam)
{
case SCCD_VDOWN:
nVscrollInc = 1L;
break;
case SCCD_VUP:
nVscrollInc = -1L;
break;
case SCCD_VPAGEDOWN:
nVscrollInc = max(1L, (LONG) (lpHexInfo->SCCScrollInfo.cyClient / lpHexInfo->SCCScrollInfo.cyChar));
break;
case SCCD_VPAGEUP:
nVscrollInc = min(-1L, -(LONG) (lpHexInfo->SCCScrollInfo.cyClient / lpHexInfo->SCCScrollInfo.cyChar));
break;
case SCCD_VPOSITION:
nVscrollInc = (LONG) ((LOWORD(lParam) * lpHexInfo->SCCScrollInfo.nVscrollMax) / MAX_VSCROLL)
- lpHexInfo->SCCScrollInfo.nVscrollPos;
break;
default:
nVscrollInc = 0L;
break;
}
if ( nVscrollInc = max(-lpHexInfo->SCCScrollInfo.nVscrollPos,
min(nVscrollInc, lpHexInfo->SCCScrollInfo.nVscrollMax - lpHexInfo->SCCScrollInfo.nVscrollPos)) )
{
lpHexInfo->SCCScrollInfo.nVscrollPos += nVscrollInc;
DUScrollDisplay(lpHexInfo, 0, -(SHORT)(lpHexInfo->SCCScrollInfo.cyChar * nVscrollInc), NULL);
DUSetVScrollPos(lpHexInfo, (SHORT)((lpHexInfo->SCCScrollInfo.nVscrollPos * MAX_VSCROLL) / lpHexInfo->SCCScrollInfo.nVscrollMax));
}
}