Win32 NetWare Core Protocol Revisited by Sven B. Schreiber Listing One // ================================================================= // PLATFORM-DEPENDENT SERVICES // ================================================================= BOOL WINAPI NwlibIsWinNT (void) { return fWinNT; } // ----------------------------------------------------------------- PWSTR WINAPI NwlibGetServerName (NWCONN_HANDLE hConnection) { return (fWinNT ? hConnection->ServerName.sBuffer : L""); } // ----------------------------------------------------------------- HANDLE WINAPI NwlibGetServerHandle (NWCONN_HANDLE hConnection) { return (fWinNT ? hConnection->hServer : hConnection); } // ----------------------------------------------------------------- BYTE WINAPI NwlibGetNcpFunction (DWORD dNcpFunctionId) { return (BYTE) (dNcpFunctionId >> 8); } // ----------------------------------------------------------------- BYTE WINAPI NwlibGetNcpSubFunction (DWORD dNcpFunctionId) { return (BYTE) dNcpFunctionId; } // ----------------------------------------------------------------- DWORD WINAPI NwlibGetNcpControlCode (DWORD dNcpFunctionId) { DWORD dNcpFunction = NwlibGetNcpFunction (dNcpFunctionId); return (fWinNT ? 0x00141003 | (dNcpFunction << 2) : 0x000000CC + (dNcpFunction)); } Listing Two // ================================================================= // NETWARE API FUNCTIONS // ================================================================= DWORD WINAPI NWGetConnectionNumber (NWCONN_HANDLE hConnection, PDWORD pdConnection) { WORD wReserved; DWORD dStatus; *pdConnection = 0; dStatus = NwlibMakeNcp (NwlibGetServerHandle (hConnection), NwlibGetNcpControlCode (_GET_STATION_NUMBER), RqSize (0), RpSize (WORD_+BYTE_), "|wb", &wReserved, pdConnection); return dStatus; } // ----------------------------------------------------------------- DWORD WINAPI NWGetConnectionInformation (NWCONN_HANDLE hConnection, DWORD dConnection, NWOBJECT_NAME ObjectName, PWORD pwObjectType, PDWORD pdObjectId, PNWDATE_TIME pLoginTime) { DWORD dStatus; dStatus = NwlibMakeNcp (NwlibGetServerHandle (hConnection), NwlibGetNcpControlCode (_GET_STATION_LOGGED_INFORMATION), RqSize (BYTE_+DWORD_), RpSize (DWORD_+WORD_+NWOBJECT_NAME_+NWDATE_TIME_+BYTE_), "br|dwrr", NwlibGetNcpSubFunction (_GET_STATION_LOGGED_INFORMATION), &dConnection, DWORD_, pdObjectId, pwObjectType, ObjectName, NWOBJECT_NAME_, pLoginTime, NWDATE_TIME_); return dStatus; } Listing Three // ================================================================= // MAIN ROUTINES // ================================================================= void DisplayVolumeNames (NWCONN_HANDLE hConnection) { BYTE bVolume; NWVOLUME_NAME VolumeName; DWORD dStatus; printf ("\n\nEnumerating volumes ..."); for (bVolume = 0; bVolume < NW_MAX_VOLUMES; bVolume++) { dStatus = NWGetVolumeName (hConnection, bVolume, VolumeName); if (!dStatus) { if (VolumeName [0]) { printf ("\n Volume #%02lu = \"%s\"", bVolume+1, VolumeName); } } } return; } // ----------------------------------------------------------------- void DisplayConnectionData (NWCONN_HANDLE hConnection) { DWORD dConnection; NWOBJECT_NAME ObjectName; WORD wObjectType; DWORD dObjectId; NWDATE_TIME LoginTime; DWORD dStatus; printf ("\n\nRetrieving the connection number ..."); dStatus = NWGetConnectionNumber (hConnection, &dConnection); if (!dStatus) { printf ("\n Connection number = %lu", dConnection); printf ("\n\nRetrieving connection information ..."); dStatus = NWGetConnectionInformation (hConnection, dConnection, ObjectName, &wObjectType, &dObjectId, &LoginTime); if (!dStatus) { printf ("\n Object name = \"%s\"", ObjectName); printf ("\n Object type = 0x%04X", wObjectType); printf ("\n Object ID = 0x%08X", dObjectId); } } return; } Example 1: DWORD WINAPI NwlibMakeNcp (HANDLE hDevice, DWORD dIoControlCode, DWORD dInBufferSize, DWORD dOutBufferSize, PSTR psFragmentControl, ...); Example 2: WORD WINAPI NWAttachToFileServer (PSTR psServerName, WORD wScopeFlag, PNWCONN_HANDLE phConnection); Example 3: (a) typedef NWCONN_HANDLE_DATA *NWCONN_HANDLE; (b) typedef struct _NWCONN_HANDLE_DATA { HANDLE hServer; UNICODE_STRING ServerName; } NWCONN_HANDLE_DATA, *PNWCONN_HANDLE_DATA; (c) typedef struct _UNICODE_STRING { WORD wLength; WORD wMaximumLength; PWSTR sBuffer; } UNICODE_STRING, *PUNICODE_STRING; (d) WORD WINAPI NWDetachFromFileServer (NWCONN_HANDLE hConnection); 3