/*++ Copyright (c) 1989-1993 Microsoft Corporation Module Name: wfwnet.c Abstract: Provides entry points for the functions that will be mapped to LANMAN.DRV. Author: Chuck Y Chan (ChuckC) 25-Mar-1993 Revision History: --*/ #include #include #define MAX_PATH 260 WORD vLastCall = LAST_CALL_IS_LOCAL ; WORD vLastError = 0 ; WORD wNetTypeCaps ; /* Current capabilities */ WORD wUserCaps ; WORD wConnectionCaps ; WORD wErrorCaps ; WORD wDialogCaps ; WORD wAdminCaps ; WORD wSpecVersion = 0x0310 ; WORD wDriverVersion = 0x0300 ; WORD _acrtused=0; void I_SetCapBits(void) ; // // global pointers to functions // LPWNETOPENJOB lpfnWNetOpenJob = NULL ; LPWNETCLOSEJOB lpfnWNetCloseJob = NULL ; LPWNETWRITEJOB lpfnWNetWriteJob = NULL ; LPWNETABORTJOB lpfnWNetAbortJob = NULL ; LPWNETHOLDJOB lpfnWNetHoldJob = NULL ; LPWNETRELEASEJOB lpfnWNetReleaseJob = NULL ; LPWNETCANCELJOB lpfnWNetCancelJob = NULL ; LPWNETSETJOBCOPIES lpfnWNetSetJobCopies = NULL ; LPWNETWATCHQUEUE lpfnWNetWatchQueue = NULL ; LPWNETUNWATCHQUEUE lpfnWNetUnwatchQueue = NULL ; LPWNETLOCKQUEUEDATA lpfnWNetLockQueueData = NULL ; LPWNETUNLOCKQUEUEDATA lpfnWNetUnlockQueueData = NULL ; LPWNETQPOLL lpfnWNetQPoll = NULL ; LPWNETDEVICEMODE lpfnWNetDeviceMode = NULL ; LPWNETVIEWQUEUEDIALOG lpfnWNetViewQueueDialog = NULL ; LPWNETGETCAPS lpfnWNetGetCaps16 = NULL ; LPWNETGETERROR lpfnWNetGetError16 = NULL ; LPWNETGETERRORTEXT lpfnWNetGetErrorText16 = NULL ; extern VOID FAR PASCAL GrabInterrupts(void); int FAR PASCAL LibMain(HINSTANCE hInstance, WORD wDataSeg, WORD cbHeapSize, LPSTR lpszCmdLine) ; /* * functions passed to LANMAN.DRV */ WORD API WNetOpenJob(LPSTR p1,LPSTR p2,WORD p3,LPINT p4) { WORD err ; if (!lpfnWNetOpenJob) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetOpenJob, "WNETOPENJOB" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetOpenJob)(p1,p2,p3,p4) ) ; } WORD API WNetCloseJob(WORD p1,LPINT p2,LPSTR p3) { WORD err ; if (!lpfnWNetCloseJob) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetCloseJob, "WNETCLOSEJOB" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetCloseJob)(p1,p2,p3) ) ; } WORD API WNetWriteJob(HANDLE p1,LPSTR p2,LPINT p3) { WORD err ; if (!lpfnWNetWriteJob) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetWriteJob, "WNETWRITEJOB" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetWriteJob)(p1,p2,p3) ) ; } WORD API WNetAbortJob(WORD p1,LPSTR p2) { WORD err ; if (!lpfnWNetAbortJob) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetAbortJob, "WNETABORTJOB" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetAbortJob)(p1,p2) ) ; } WORD API WNetHoldJob(LPSTR p1,WORD p2) { WORD err ; if (!lpfnWNetHoldJob) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetHoldJob, "WNETHOLDJOB" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetHoldJob)(p1,p2) ) ; } WORD API WNetReleaseJob(LPSTR p1,WORD p2) { WORD err ; if (!lpfnWNetReleaseJob) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetReleaseJob, "WNETRELEASEJOB" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetReleaseJob)(p1,p2) ) ; } WORD API WNetCancelJob(LPSTR p1,WORD p2) { WORD err ; if (!lpfnWNetCancelJob) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetCancelJob, "WNETCANCELJOB" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetCancelJob)(p1,p2) ) ; } WORD API WNetSetJobCopies(LPSTR p1,WORD p2,WORD p3) { WORD err ; if (!lpfnWNetSetJobCopies) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetSetJobCopies, "WNETSETJOBCOPIES" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetSetJobCopies)(p1,p2,p3) ) ; } WORD API WNetWatchQueue(HWND p1,LPSTR p2,LPSTR p3,WORD p4) { WORD err ; if (!lpfnWNetWatchQueue) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetWatchQueue, "WNETWATCHQUEUE" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetWatchQueue)(p1,p2,p3,p4) ) ; } WORD API WNetUnwatchQueue(LPSTR p1) { WORD err ; if (!lpfnWNetUnwatchQueue) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetUnwatchQueue, "WNETUNWATCHQUEUE" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetUnwatchQueue)(p1) ) ; } WORD API WNetLockQueueData(LPSTR p1,LPSTR p2,LPQUEUESTRUCT FAR *p3) { WORD err ; if (!lpfnWNetLockQueueData) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetLockQueueData, "WNETLOCKQUEUEDATA" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetLockQueueData)(p1,p2,p3) ) ; } WORD API WNetUnlockQueueData(LPSTR p1) { WORD err ; if (!lpfnWNetUnlockQueueData) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetUnlockQueueData, "WNETUNLOCKQUEUEDATA" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetUnlockQueueData)(p1) ) ; } void API WNetQPoll(HWND hWnd, unsigned iMessage, WORD wParam, LONG lParam) { WORD err ; if (!lpfnWNetQPoll) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetQPoll, "WNETQPOLL" ) ; if (err) { SetLastError(err) ; return ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; (*lpfnWNetQPoll)(hWnd, iMessage, wParam, lParam) ; } WORD API WNetDeviceMode(HWND p1) { WORD err ; if (!lpfnWNetDeviceMode) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetDeviceMode, "WNETDEVICEMODE" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetDeviceMode)(p1) ) ; } WORD API WNetViewQueueDialog(HWND p1,LPSTR p2) { WORD err ; if (!lpfnWNetViewQueueDialog) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetViewQueueDialog, "WNETVIEWQUEUEDIALOG" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetViewQueueDialog)(p1,p2) ) ; } WORD API WNetGetCaps16(WORD p1) { WORD err ; if (!lpfnWNetGetCaps16) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetGetCaps16, "WNETGETCAPS" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetGetCaps16)(p1) ) ; } WORD API WNetGetError16(LPINT p1) { WORD err ; if (!lpfnWNetGetError16) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetGetError16, "WNETGETERROR" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetGetError16)(p1) ) ; } WORD API WNetGetErrorText16(WORD p1, LPSTR p2, LPINT p3) { WORD err ; if (!lpfnWNetGetErrorText16) { // // start off as a our code until we get the entry point // vLastCall = LAST_CALL_IS_LOCAL ; // // get the entry point from LANMAN.DRV // err = GetLanmanDrvEntryPoints( (LPFN *)&lpfnWNetGetErrorText16, "WNETGETERRORTEXT" ) ; if (err) { SetLastError(err) ; return err ; } } // // note it is no longer an error in our code. and call the API // vLastCall = LAST_CALL_IS_LANMAN_DRV ; return ( (*lpfnWNetGetErrorText16)(p1,p2,p3) ) ; } WORD API WNetGetCaps(WORD nIndex) { switch (nIndex) { case WNNC_SPEC_VERSION: return wSpecVersion; case WNNC_NET_TYPE: return wNetTypeCaps; case WNNC_DRIVER_VERSION: return wDriverVersion; case WNNC_USER: return wUserCaps; case WNNC_CONNECTION: return wConnectionCaps; case WNNC_PRINTING: return (WNetGetCaps16(nIndex)) ; case WNNC_DIALOG: return wDialogCaps; case WNNC_ADMIN: return wAdminCaps; case WNNC_ERROR: return wErrorCaps; default: return 0; } } /* * misc support functions */ /******************************************************************* NAME: GetLanmanDrvEntryPoints SYNOPSIS: gets the address of the named procedure from LANMAN.DRV, will load library if first time. ENTRY: lplpfn - used to receive the address lpName - name of the procedure EXIT: RETURNS: 0 if success, error code otherwise. NOTES: HISTORY: ChuckC 25-Mar-93 Created ********************************************************************/ WORD GetLanmanDrvEntryPoints(LPFN *lplpfn, LPSTR lpName) { #define LANMANSHORTPATH "32\\" LANMAN_DRV static HINSTANCE hModule = NULL ; CHAR szLanmanFullPath[MAX_PATH + sizeof(LANMANSHORTPATH)]; USHORT usLanmanFullPathLen; // // if we havent loaded it, load it now // if (hModule == NULL) { usLanmanFullPathLen = GetSystemDirectory((LPSTR)&szLanmanFullPath, sizeof(szLanmanFullPath)); if (usLanmanFullPathLen == 0 || usLanmanFullPathLen >= sizeof(szLanmanFullPath)) { return WN_NOT_SUPPORTED ; } else { lstrcpyn(&(szLanmanFullPath[usLanmanFullPathLen]), LANMANSHORTPATH, sizeof(LANMANSHORTPATH)); hModule = LoadLibrary(szLanmanFullPath) ; if (hModule <= HINSTANCE_ERROR) return WN_NOT_SUPPORTED ; } } // // get the procedure // *lplpfn = (LPFN) GetProcAddress(hModule, lpName) ; if (! *lplpfn ) return WN_NOT_SUPPORTED ; return NO_ERROR ; } /******************************************************************* NAME: SetLastError SYNOPSIS: makes note of last error ENTRY: EXIT: RETURNS: NOTES: HISTORY: ChuckC 25-Mar-93 Created ********************************************************************/ WORD SetLastError(WORD err) { vLastError = err ; return err ; } /******************************************************************* NAME: LibMain SYNOPSIS: dll init entry point. only thing we do here is init the capability bits. ENTRY: EXIT: RETURNS: NOTES: HISTORY: ChuckC 25-Mar-93 Created ********************************************************************/ #define NETWARE_DRV "NETWARE.DRV" int FAR PASCAL LibMain(HINSTANCE hInstance, WORD wDataSeg, WORD cbHeapSize, LPSTR lpszCmdLine) { #define NETWARESHORTPATH "32\\" NETWARE_DRV BOOL fLoadNetware = FALSE ; char IsInstalledString[16] ; CHAR szNetwareFullPath[MAX_PATH + sizeof(NETWARESHORTPATH)]; USHORT usNetwareFullPathLen; UNREFERENCED(hInstance) ; UNREFERENCED(wDataSeg) ; UNREFERENCED(cbHeapSize) ; UNREFERENCED(lpszCmdLine) ; I_SetCapBits() ; if (GetProfileString("NWCS", "NwcsInstalled", "0", IsInstalledString, sizeof(IsInstalledString))) { fLoadNetware = (lstrcmp("1",IsInstalledString)==0) ; } // // Grab the interrupt for NWIPXSPX // if (fLoadNetware) { GrabInterrupts(); usNetwareFullPathLen = GetSystemDirectory((LPSTR)&szNetwareFullPath, sizeof(szNetwareFullPath)); if (usNetwareFullPathLen != 0 && usNetwareFullPathLen < sizeof(szNetwareFullPath)) { lstrcpyn(&(szNetwareFullPath[usNetwareFullPathLen]), NETWARESHORTPATH, sizeof(NETWARESHORTPATH)); // // if the file NETWARE.DRV exists, we load it. we dont really // use it, but some Netware aware apps require that it is loaded. // if (LoadLibrary(szNetwareFullPath) > HINSTANCE_ERROR) { (void)WriteProfileString("Windows", "NetWarn", "0") ; } } } return 1 ; } /******************************************************************* NAME: I_SetCapBits SYNOPSIS: initernal routine to set the capability bits ENTRY: EXIT: RETURNS: NOTES: HISTORY: ChuckC 25-Mar-93 Created ********************************************************************/ void I_SetCapBits(void) { wNetTypeCaps = WNNC_NET_MultiNet | WNNC_SUBNET_WinWorkgroups; wUserCaps = WNNC_USR_GetUser; wConnectionCaps = (WNNC_CON_AddConnection | WNNC_CON_CancelConnection | WNNC_CON_GetConnections | WNNC_CON_AutoConnect | WNNC_CON_BrowseDialog | WNNC_CON_RestoreConnection ) ; wErrorCaps = WNNC_ERR_GetError | WNNC_ERR_GetErrorText; wDialogCaps = (WNNC_DLG_DeviceMode | WNNC_DLG_ShareAsDialog | WNNC_DLG_PropertyDialog | WNNC_DLG_ConnectionDialog | WNNC_DLG_ConnectDialog | WNNC_DLG_DisconnectDialog | WNNC_DLG_BrowseDialog ); wAdminCaps = ( WNNC_ADM_GetDirectoryType | WNNC_ADM_DirectoryNotify ) ; /* disable LFN for now | WNNC_ADM_LongNames ) ; */ }