mirror of https://github.com/lianthony/NT4.0
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
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;
|
|
}
|