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.
 
 
 
 
 
 

486 lines
9.1 KiB

/*
| SCC Viewer Technology - Source file
|
| Code: SCCFA.C
| Module: SCCFA
| Developer: Phil Boutros
| Environment: Portable
| Function: Handles access to filters
|
*/
#include <PLATFORM.H>
#include <SCCUT.H>
#include <SCCIO.H>
#include <SCCLS.H>
#include <SCCLO.H>
#include <SCCFA.H>
#include "sccfa.pro"
#ifdef WIN16
typedef VOID (VW_ENTRYMOD * VWGETRTNS)(VWRTNS VWPTR *,WORD);
#include "sccfa_w.c"
#endif
#ifdef WIN32
typedef VOID (VW_ENTRYMOD * VWGETRTNS)(VWRTNS VWPTR *,WORD);
#include "sccfa_n.c"
#endif
#ifdef MAC
typedef VOID (VW_ENTRYMOD * VWGETRTNS)(VWRTNS VWPTR *,WORD);
#include "sccfa_m.c"
#endif
#ifdef OS2
typedef VOID (* VW_ENTRYMOD VWGETRTNS)(VWRTNS VWPTR *,WORD);
#include "sccfa_o.c"
#endif
#ifndef OS2
BOOL gInit = FALSE;
HANDLE gFilterList;
#define FA_FILTERALLOCED 0x0001
#define FA_FILTERLOADED 0x0002
#define FA_PROCALLOCED 0x0004
#define FA_STREAMOPEN 0x0008
FA_ENTRYSC HANDLE FA_ENTRYMOD FAOpen(hFile,wId,pOpenRet,pFailureCode)
HIOFILE hFile;
WORD wId;
SHORT FAR * pOpenRet;
WORD FAR * pFailureCode;
{
BOOL locFailure;
HANDLE locFilterHnd;
DWORD locFlags;
PFILTER locFilterPtr;
VWGETRTNS locVwGetRtnsPtr;
HANDLE locCodeHnd;
HIOFILE locDummy;
PFAFILTERINFO locFilterInfoPtr;
FAFILTERINFO locFilterInfo;
BYTE locFileName[512];
locFailure = FALSE;
locFlags = 0;
/*
| Allocate a FILTER structure
*/
if (!locFailure)
{
locFilterHnd = UTGlobalAlloc(sizeof(FILTER));
if (locFilterHnd == NULL)
{
*pFailureCode = FAERR_HFILTERALLOCFAILED;
locFailure = TRUE;
}
else
{
UTFlagOn(locFlags,FA_FILTERALLOCED);
locFilterPtr = (PFILTER) UTGlobalLock(locFilterHnd);
}
}
/*
| Fill the FILTER structure
*/
if (!locFailure)
{
locFilterPtr->wId = wId;
locFilterPtr->pWakeFunc = NULL;
locFilterPtr->pSleepFunc = NULL;
/* locFilterPtr->bFileOpen = TRUE; */
}
/*
| Look for a filter that handle the id in the wId parameter
*/
if (!locFailure)
{
DWORD locFilterIndex;
DWORD locFilterCount;
WORD locIdIndex;
BOOL locFound;
LSGetListCount(gFilterList,&locFilterCount);
locFilterIndex = 0;
locFound = FALSE;
#ifdef WIN32
{
// Check for third party add on filters.
// See if the registry contains an entry for this extension.
// -Geoff, 4-7-95
LPSTR pExt;
// Get the extension:
IOGetInfo(hFile, IOGETINFO_FILENAME, (VOID FAR *) locFileName);
pExt = &(locFileName[ lstrlen(locFileName)-1 ]);
while( pExt != (LPSTR)locFileName )
{
pExt--;
if( *pExt == '.' )
break;
}
if( *pExt == '.' )
{
HKEY locKeyHnd;
LONG locValueSize = 32; // this is the size of the szCode field
int locExtLen = lstrlen(pExt); // Can an extension be more than 3 chars with a long file name system??? Inquiring minds want to know.
lstrcpy( &(locFileName[511-locExtLen]), pExt );
pExt = &(locFileName[511-locExtLen]);
wsprintf(locFileName, "SOFTWARE\\Classes\\QuickView\\%s\\{F0F08735-0C36-101B-B086-0020AF07D0F4}\\QuickViewAddOn", pExt );
if( ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,locFileName,0,KEY_ALL_ACCESS,&locKeyHnd) )
{
if( ERROR_SUCCESS ==
RegQueryValueEx(locKeyHnd,"DllName",0,NULL,
(LPBYTE)&locFilterInfo.sFilterInfoNP.szCode,
&locValueSize) )
{
locFound = TRUE;
}
RegCloseKey(locKeyHnd);
}
}
}
#endif
while (!locFound && locFilterIndex < locFilterCount)
{
LSLockElementByIndex(gFilterList,locFilterIndex,(VOID FAR * FAR *)&locFilterInfoPtr);
locIdIndex = 0;
while (!locFound && locIdIndex < locFilterInfoPtr->wIdCount)
{
if (locFilterInfoPtr->aIds[locIdIndex] == wId)
{
locFound = TRUE;
locFilterInfo = *locFilterInfoPtr;
}
locIdIndex++;
}
LSUnlockElementByIndex(gFilterList,locFilterIndex);
locFilterIndex++;
}
if (!locFound)
{
*pFailureCode = FAERR_FILTERNOTAVAIL;
locFailure = TRUE;
}
}
/*
| Load the filter
| and get address of its entry routine and handle to filter
*/
if (!locFailure)
{
if (FALoadNP(&locFilterInfo.sFilterInfoNP, &locVwGetRtnsPtr, &locCodeHnd) == FAERR_OK)
{
UTFlagOn(locFlags,FA_FILTERLOADED);
locFilterPtr->hCode = locCodeHnd;
}
else
{
*pFailureCode = FAERR_FILTERLOADFAILED;
locFailure = TRUE;
}
}
/*
| Call the entry routine to get addresses of all other routines
*/
if (!locFailure)
{
locVwGetRtnsPtr(&(locFilterPtr->VwRtns),VWRTN_DOSPECIAL);
}
/*
| Have the filter allocate its Proc structure
| and return a handle to it
*/
if (!locFailure)
{
locFilterPtr->hProc = locFilterPtr->VwRtns.AllocProc();
if (locFilterPtr->hProc == NULL)
{
*pFailureCode = FAERR_FILTERLOADFAILED;
locFailure = TRUE;
}
else
{
locFilterPtr->VwRtns.LocalUp(hFile,&(locFilterPtr->hFile),locFilterPtr->hProc);
UTFlagOn(locFlags,FA_PROCALLOCED);
}
}
#ifdef NEVER
/* 11/15/93 */
/*
| Setup IOOpen routine
*/
if (!locFailure)
{
locFilterPtr->VwRtns.SetSoRtn(SOOPENFILE, (VOID FAR *)SOOpenFile, locFilterPtr->hProc);
}
#endif
/*
| Get the base file name from the IO system
*/
#ifdef NEVER
if (IOGetInfo(hFile,IOGETINFO_FILENAME,locFileName) != IOERR_OK)
{
locFileName[0] = 0x00;
}
else
{
/*
| For the moment, truncate this file name to 12 characters (DOS length)
| so filters do not have to be modified.
| PJB XXX
*/
locFileName[12] = 0x00;
}
#else
//
// SDN for ms changed the IOGetInfo to get the full path of the file.....
//
if (IOGetInfo(hFile,IOGETINFO_PATHNAME,locFileName) != IOERR_OK)
{
locFileName[0] = 0x00;
}
#endif
/*
| Call the filters open routine
*/
if (!locFailure)
{
#if _DEBUG
*pOpenRet = locFilterPtr->VwRtns.StreamOpen(locFilterPtr->hFile, wId, locFileName, &(locFilterPtr->VwInfo), locFilterPtr->hProc);
#else
CRITICAL_SECTION critter;
InitializeCriticalSection(&critter);
EnterCriticalSection(&critter);
*pOpenRet = SafeStreamOpen ( locFilterPtr, wId, locFileName );
LeaveCriticalSection(&critter);
#endif
if (*pOpenRet < 0)
{
*pFailureCode = FAERR_STREAMOPENFAILED;
locFailure = TRUE;
}
else
{
UTFlagOn(locFlags, FA_STREAMOPEN);
}
}
if (!locFailure)
{
/*
| Unlock the FILTER structure and return its handle
*/
UTGlobalUnlock(locFilterHnd);
return(locFilterHnd);
}
else
{
/*
| Error occured - Shut down filter
*/
if (locFlags & FA_PROCALLOCED)
{
locFilterPtr->VwRtns.LocalDown(locFilterPtr->hFile,&locDummy,locFilterPtr->hProc);
locFilterPtr->VwRtns.FreeProc(locFilterPtr->hProc);
}
if (locFlags & FA_FILTERLOADED)
{
FAUnloadNP(locFilterPtr->hCode);
}
if (locFlags & FA_FILTERALLOCED)
{
UTGlobalUnlock(locFilterHnd);
UTGlobalFree(locFilterHnd);
}
return(0);
}
} /* FAOpen */
FA_ENTRYSC VOID FA_ENTRYMOD FAClose(hFilter)
HANDLE hFilter;
{
PFILTER locFilterPtr;
HIOFILE locDummy;
UINT flags;
UINT lockCount;
flags = GlobalFlags(hFilter);
lockCount = GMEM_LOCKCOUNT & flags;
locFilterPtr = (PFILTER) UTGlobalLock(hFilter);
locFilterPtr->VwRtns.StreamClose(locFilterPtr->hFile,locFilterPtr->hProc);
locFilterPtr->VwRtns.LocalDown(locFilterPtr->hFile,&locDummy,locFilterPtr->hProc);
locFilterPtr->VwRtns.FreeProc(locFilterPtr->hProc);
FAUnloadNP(locFilterPtr->hCode);
UTGlobalUnlock(hFilter);
UTGlobalFree(hFilter);
} /* FAClose */
FAERR FAVerifyFilterList(HANDLE hList)
{
return(FAVerifyFilterListNP(hList));
}
FAERR FABuildFilterList(HANDLE hList)
{
FAFILTERINFO locFilterInfo;
FAFILTERINFONP locFilterInfoNP;
FAERR locRet;
HANDLE locCode;
VWGETRTNS locVwGetRtnsPtr;
VWRTNS locVwRtns;
WORD locIndex;
LSClearList(hList);
locRet = FAGetFirstFilterNP(&locFilterInfoNP);
locIndex = 0;
while (locRet == FAERR_OK)
{
locRet = FALoadNP(&locFilterInfoNP,&locVwGetRtnsPtr,&locCode);
if (locRet == FAERR_OK)
{
locVwGetRtnsPtr(&locVwRtns,VWRTN_GETINFO);
/*
| I am cheating, I know that GetInfo does not
| use hProc. PJB
*/
locVwRtns.GetInfo(&locFilterInfo.wIdCount,VWINFO_IDCOUNT,0);
locVwRtns.GetInfo(locFilterInfo.aIds,VWINFO_IDS,0);
locFilterInfo.sFilterInfoNP = locFilterInfoNP;
FAUnloadNP(locCode);
LSAddElement(hList,&locFilterInfo);
locIndex++;
}
locRet = FAGetNextFilterNP(&locFilterInfoNP);
}
return(FAERR_OK);
}
FA_ENTRYSC FAERR FA_ENTRYMOD FAInit(BOOL bVerify)
{
FAERR locRet;
LSERR locLsErr;
locRet = FAERR_OK;
if (gInit == FALSE)
{
gFilterList = NULL;
locLsErr = LSOpenList(SCCID_FILTERLIST, 0, &gFilterList);
if (locLsErr != LSERR_OK)
{
locLsErr = LSCreateList(SCCID_FILTERLIST, 0, sizeof(FAFILTERINFO), &gFilterList);
if (locLsErr != LSERR_OK)
{
locRet = FAERR_INITFAILED;
}
else
{
FABuildFilterList(gFilterList);
LSWriteList(gFilterList);
gInit = TRUE;
}
}
else
{
if (bVerify)
{
if (FAVerifyFilterList(gFilterList) != FAERR_OK)
{
FABuildFilterList(gFilterList);
}
}
gInit = TRUE;
}
}
return(locRet);
} /*FAInit*/
FA_ENTRYSC FAERR FA_ENTRYMOD FADeInit(VOID)
{
if (gInit == TRUE)
{
if (gFilterList)
LSCloseList(gFilterList,TRUE);
gInit = FALSE;
}
return(FAERR_OK);
} /*FADeInit*/
#endif