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.
 
 
 
 
 
 

540 lines
10 KiB

/* Included only in sccfa.c under Win32 */
#include "sccfa_n.pro"
HANDLE gFindHnd;
#ifdef MSCHICAGO
extern BYTE gExePath[];
extern HANDLE hInst;
#else
BYTE gExePath[256];
HANDLE hInst;
BOOL WINAPI _CRT_INIT(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved);
BOOL WINAPI DllEntryPoint(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
BYTE * pPath;
if (dwReason == DLL_PROCESS_ATTACH || dwReason == DLL_THREAD_ATTACH)
if (!_CRT_INIT(hInstance,dwReason,lpReserved))
return(FALSE);
if (dwReason == DLL_PROCESS_ATTACH)
{
hInst = hInstance;
GetModuleFileName(hInstance, gExePath, 256);
/*
| Strip the file name
*/
pPath = gExePath;
while (*pPath != 0x00)
pPath++;
while (*pPath != '\\' && *pPath != ':')
pPath--;
pPath++;
*pPath = 0x00;
}
if (dwReason == DLL_PROCESS_DETACH || dwReason == DLL_THREAD_DETACH)
if (!_CRT_INIT(hInstance,dwReason,lpReserved))
return(FALSE);
return(TRUE);
}
#endif // MSCHICAGO
FAERR FALoadNP(PFAFILTERINFONP pFilterInfoNP, VWGETRTNS FAR * ppVwGetRtns, HANDLE FAR * phCode)
{
FAERR locRet;
BYTE locPath[256];
OFSTRUCT locOf;
UTstrcpy(locPath,gExePath);
UTstrcat(locPath,pFilterInfoNP->szCode);
if (OpenFile(locPath,&locOf,OF_EXIST) != -1)
*phCode = LoadLibrary(locPath);
else
*phCode = 0;
if (*phCode == NULL)
{
locRet = FAERR_FILTERLOADFAILED;
}
else
{
*ppVwGetRtns = (VOID FAR *)GetProcAddress(*phCode,"VwGetRtns");
if (*ppVwGetRtns == NULL)
{
OutputDebugString("\r\nGetProcAddress of VwGetRtns failed");
locRet = FAERR_FILTERLOADFAILED;
}
else
{
locRet = FAERR_OK;
}
}
return(locRet);
}
VOID FAUnloadNP(HANDLE hCode)
{
FreeLibrary(hCode);
}
#ifdef NEVER
FAERR FAVerifyFilterListNP(HANDLE hList)
{
return(FAERR_OK);
}
#endif /*NEVER*/
FAERR FAVerifyFilterListNP(HANDLE hList)
{
FAERR locRet;
DWORD locFilterCount;
DWORD locCount;
WIN32_FIND_DATA locFind;
BYTE locPath[MAX_PATH];
HANDLE locFindHnd;
BOOL locNextRet;
PFAFILTERINFO locFilterInfoPtr;
locRet = FAERR_OK;
LSGetListCount(hList,&locFilterCount);
UTstrcpy(locPath,gExePath);
UTstrcat(locPath,"VS*.DLL");
locCount = 0;
locFindHnd = FindFirstFileA(locPath,&locFind);
if (locFindHnd != INVALID_HANDLE_VALUE)
{
locNextRet = TRUE;
while (locNextRet && locRet == FAERR_OK && locCount < locFilterCount)
{
LSLockElementByIndex(hList, locCount, &locFilterInfoPtr);
if (UTstrcmp(locFilterInfoPtr->sFilterInfoNP.szCode,locFind.cFileName)
|| CompareFileTime(&(locFilterInfoPtr->sFilterInfoNP.ftTime),&(locFind.ftLastWriteTime)))
{
locRet = FAERR_REBUILD;
}
LSUnlockElementByIndex(hList, locCount);
locCount++;
locNextRet = FindNextFileA(locFindHnd,&locFind);
}
FindClose(locFindHnd);
if (locCount != locFilterCount)
{
locRet = FAERR_REBUILD;
}
else
{
if (locNextRet)
{
locRet = FAERR_REBUILD;
}
}
}
else
{
locRet = FAERR_REBUILD;
}
return(locRet);
}
FAERR FAGetFirstFilterNP(PFAFILTERINFONP pFilterInfoNP)
{
FAERR locRet;
WIN32_FIND_DATA locFind;
BYTE locPath[MAX_PATH];
#ifdef SCCFEATURE_DIALOGS
FACreateRebuildWnd();
#endif //SCCFEATURE_DIALOGS
UTstrcpy(locPath,gExePath);
UTstrcat(locPath,"VS*.DLL");
gFindHnd = FindFirstFileA(locPath,&locFind);
if (gFindHnd != INVALID_HANDLE_VALUE)
{
UTstrcpy(pFilterInfoNP->szCode,locFind.cFileName);
pFilterInfoNP->ftTime = locFind.ftLastWriteTime;
#ifdef SCCFEATURE_DIALOGS
FASetRebuildText(pFilterInfoNP->szCode);
#endif //SCCFEATURE_DIALOGS
locRet = FAERR_OK;
}
else
{
#ifdef SCCFEATURE_DIALOGS
FADestroyRebuildWnd();
#endif //SCCFEATURE_DIALOGS
locRet = FAERR_NOMORE;
}
return(locRet);
}
FAERR FAGetNextFilterNP(PFAFILTERINFONP pFilterInfoNP)
{
FAERR locRet;
WIN32_FIND_DATA locFind;
BOOL locNextRet;
locNextRet = FindNextFileA(gFindHnd,&locFind);
if (locNextRet == TRUE)
{
UTstrcpy(pFilterInfoNP->szCode,locFind.cFileName);
pFilterInfoNP->ftTime = locFind.ftLastWriteTime;
#ifdef SCCFEATURE_DIALOGS
FASetRebuildText(pFilterInfoNP->szCode);
#endif //SCCFEATURE_DIALOGS
locRet = FAERR_OK;
}
else
{
#ifdef SCCFEATURE_DIALOGS
FADestroyRebuildWnd();
#endif //SCCFEATURE_DIALOGS
FindClose(gFindHnd);
locRet = FAERR_NOMORE;
}
return(locRet);
}
#ifdef SCCFEATURE_DIALOGS
#define BITMAPWIDTH 300
#define BITMAPHEIGHT 120
#define TEXTMESSAGE WM_USER+1000
HWND gRebuildWnd;
HFONT gRebuildFont;
VOID FACreateRebuildWnd()
{
WNDCLASS locClass;
int locX;
int locY;
gRebuildWnd = NULL;
locClass.style = CS_SAVEBITS;
locClass.lpfnWndProc = (WNDPROC)FARebuildWndProc;
locClass.cbClsExtra = 0;
locClass.cbWndExtra = 0;
locClass.hInstance = hInst;
locClass.hIcon = NULL;
locClass.hCursor = NULL;
locClass.hbrBackground = NULL;
locClass.lpszMenuName = (LPSTR) NULL;
locClass.lpszClassName = (LPSTR) "SCCFAREBUILD";
if (!RegisterClass(&locClass))
return;
locX = GetSystemMetrics(SM_CXSCREEN);
locY = GetSystemMetrics(SM_CYSCREEN);
locX = (locX - BITMAPWIDTH) / 2;
locY = (locY - BITMAPWIDTH) / 2;
gRebuildWnd = CreateWindow("SCCFAREBUILD",
NULL,
WS_POPUP,
locX,locY,BITMAPWIDTH,BITMAPHEIGHT,
NULL,
NULL,
hInst,
NULL);
if (gRebuildWnd == NULL)
{
UnregisterClass("SCCFAREBUILD",hInst);
}
else
{
InvalidateRect(gRebuildWnd,NULL,TRUE);
ShowWindow(gRebuildWnd,SW_SHOW);
UpdateWindow(gRebuildWnd);
}
}
VOID FADestroyRebuildWnd()
{
if (gRebuildWnd)
{
DestroyWindow(gRebuildWnd);
UnregisterClass("SCCFAREBUILD",hInst);
}
}
VOID FASetRebuildText(BYTE FAR * pText)
{
SendMessage(gRebuildWnd,TEXTMESSAGE,0,(LPARAM)pText);
}
LRESULT WIN_ENTRYMOD FARebuildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT locRet;
HDC locDC;
HDC locMemoryDC;
PAINTSTRUCT locPaint;
HBITMAP locBitmap;
HBITMAP locOldBitmap;
RECT locRect;
int locHeight;
HFONT locOldFont;
HBRUSH locBrush;
switch (message)
{
case WM_CREATE:
gRebuildFont = NULL;
locDC = GetDC(hWnd);
locHeight = -MulDiv(8,GetDeviceCaps(locDC,LOGPIXELSY),72);
ReleaseDC(hWnd,locDC);
if ((WORD)GetVersion() == 0x0003) /* Windows 3.0 */
{
gRebuildFont = CreateFont(locHeight,0,0,0,FW_NORMAL,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,VARIABLE_PITCH,(LPSTR) "Helv");
}
else
{
gRebuildFont = CreateFont(locHeight,0,0,0,FW_NORMAL,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,VARIABLE_PITCH,(LPSTR) "MS Sans Serif");
}
break;
case WM_DESTROY:
if (gRebuildFont)
{
DeleteObject(gRebuildFont);
}
break;
case WM_PAINT:
locDC = BeginPaint(hWnd,&locPaint);
locBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(TECHBITMAP16));
locMemoryDC = CreateCompatibleDC(locDC);
locOldBitmap = SelectObject(locMemoryDC,locBitmap);
BitBlt(locDC, 0, 0, BITMAPWIDTH, BITMAPHEIGHT, locMemoryDC, 0, 0, SRCCOPY);
SelectObject(locMemoryDC,locOldBitmap);
DeleteObject(locBitmap);
EndPaint(hWnd,&locPaint);
{
DWORD locStart;
locStart = GetCurrentTime();
while (GetCurrentTime() - locStart < 2000);
}
break;
case TEXTMESSAGE:
locDC = GetDC(hWnd);
locRect.top = 75;
locRect.bottom = 90;
locRect.left = 79;
locRect.right = 278;
SetBkMode(locDC,TRANSPARENT);
if (gRebuildFont)
locOldFont = SelectObject(locDC,gRebuildFont);
locBrush = CreateSolidBrush(RGB(192,192,192));
FillRect(locDC,&locRect,locBrush);
DrawText(locDC,(LPSTR)lParam,-1,&locRect,DT_CENTER | DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER);
DeleteObject(locBrush);
if (gRebuildFont)
SelectObject(locDC,locOldFont);
ReleaseDC(hWnd,locDC);
break;
default:
locRet = DefWindowProc(hWnd, message, wParam, lParam);
}
return(locRet);
}
#endif //SCCFEATURE_DIALOGS
/*******
Thread Stuff for bad loops in filters open functions
*******/
typedef struct sccfathreadstuff_tag
{
PFILTER pFilter;
HANDLE hEvent;
WORD wId;
LPSTR lpFileName;
SHORT nRet;
} SCCFATHREADSTUFF, *LPSCCFATHREADSTUFF;
HANDLE SetupStreamOpenEvent ( VOID )
{
HANDLE locEventHandle;
DWORD locErr;
locEventHandle = CreateEvent (NULL,
FALSE, // auto Reset
FALSE, // initially unsignaled
"StreamOpenEventObject" );
if (locEventHandle == NULL)
{
DebugBreak();
locErr = GetLastError ();
}
return locEventHandle;
}
void CloseStreamOpenEvent (hEvent)
HANDLE hEvent;
{
CloseHandle (hEvent);
}
DWORD FAThreadStreamOpen ( dwArg )
DWORD dwArg;
{
LPSCCFATHREADSTUFF lpTS;
PFILTER pFilter;
char szSemName[] = "SCCStreamOpenSem";
lpTS = (LPSCCFATHREADSTUFF) dwArg;
if (lpTS)
pFilter = (PFILTER) lpTS->pFilter;
else
return 0;
lpTS->hEvent = OpenSemaphore(SEMAPHORE_ALL_ACCESS,TRUE, szSemName );
if( lpTS->hEvent == NULL )
{
// Set priority high for first instance, all else stay normal.
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST );
lpTS->hEvent = CreateSemaphore(NULL,1,100,szSemName);
}
if (pFilter != NULL)
lpTS->nRet = (*(pFilter->VwRtns.StreamOpen))(pFilter->hFile, lpTS->wId, lpTS->lpFileName, &(pFilter->VwInfo), pFilter->hProc);
// SetEvent (lpTS->hEvent);
return 1;
}
// 1. Created the EventObject for Thread Termination
// 2. Create the new thread for the StreamRead
// 3. Suspend this process until Event or Timeout
// 4. If Timeout, then terminate thread.
SHORT SafeStreamOpen (pFilter, wId, lpFileName)
PFILTER pFilter;
WORD wId;
LPSTR lpFileName;
{
DWORD dwThreadID;
DWORD locWait;
SCCFATHREADSTUFF locTS;
HANDLE hThread;
HANDLE hEvent;
// Not needed. hEvent = SetupStreamOpenEvent ();
//locTS.hEvent = hEvent;
locTS.pFilter = pFilter;
locTS.wId = wId;
locTS.lpFileName = lpFileName;
locTS.nRet = 0;
if (pFilter != NULL)
{
hThread = CreateThread (NULL,
0, //default stack
(LPTHREAD_START_ROUTINE) FAThreadStreamOpen,
(LPVOID) &locTS,
0,
&dwThreadID );
locWait = WaitForSingleObject (hThread, 15000); // 15 second timeout
if (locWait == WAIT_TIMEOUT)
{
TerminateThread ( hThread, (DWORD) 0 );
locTS.nRet = VWERR_BADFILE;
}
if (hThread)
CloseHandle (hThread);
}
// CloseStreamOpenEvent (hEvent);
CloseHandle(locTS.hEvent);
return locTS.nRet;
}