diff options
Diffstat (limited to '')
-rw-r--r-- | private/nw/nwscript/ncp.c | 356 |
1 files changed, 356 insertions, 0 deletions
diff --git a/private/nw/nwscript/ncp.c b/private/nw/nwscript/ncp.c new file mode 100644 index 000000000..72b453350 --- /dev/null +++ b/private/nw/nwscript/ncp.c @@ -0,0 +1,356 @@ + +/************************************************************************* +* +* NCP.C +* +* All routines doing direct NCPs or filecontrol operations +* +* Copyright (c) 1995 Microsoft Corporation +* +* $Log: N:\NT\PRIVATE\NW4\NWSCRIPT\VCS\NCP.C $ +* +* Rev 1.2 10 Apr 1996 14:22:50 terryt +* Hotfix for 21181hq +* +* Rev 1.2 12 Mar 1996 19:54:06 terryt +* Relative NDS names and merge +* +* Rev 1.1 22 Dec 1995 14:24:56 terryt +* Add Microsoft headers +* +* Rev 1.0 15 Nov 1995 18:07:10 terryt +* Initial revision. +* +*************************************************************************/ +#include <stdio.h> +#include <direct.h> +#include <time.h> +#include <stdlib.h> + +#include <nt.h> +#include <ntrtl.h> +#include <nturtl.h> +#include <windows.h> + +#include <nwapi32.h> +#include <ntddnwfs.h> + +#include "nwscript.h" +#include "ntnw.h" +#include "inc/nwlibs.h" + + +/******************************************************************** + + NTGetUserID + +Routine Description: + + Given a connection handle, return the user ID + +Arguments: + + ConnectionHandle - Connection Handle + UserID - returned User ID + +Return Value: + 0 = success + else NT error + + *******************************************************************/ +unsigned int +NTGetUserID( + unsigned int ConnectionHandle, + unsigned long *pUserID + ) +{ + NTSTATUS NtStatus ; + unsigned int ObjectType; + unsigned char LoginTime[7]; + unsigned char UserName[48]; + VERSION_INFO VerInfo; + unsigned int Version; + unsigned int ConnectionNum; + PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)ConnectionHandle ; + + NtStatus = GetConnectionNumber( ConnectionHandle, &ConnectionNum ); + + if (!NT_SUCCESS(NtStatus)) + return NtStatus; + + NtStatus = NWGetFileServerVersionInfo( (NWCONN_HANDLE)ConnectionHandle, + &VerInfo ); + + if (!NT_SUCCESS(NtStatus)) + return NtStatus; + + Version = VerInfo.Version * 1000 + VerInfo.SubVersion * 10; + + if ( ( Version >= 3110 ) || ( Version < 2000 ) ) { + NtStatus = NwlibMakeNcp( + pServerInfo->hConn, // Connection Handle + FSCTL_NWR_NCP_E3H, // Bindery function + 8, // Max request packet size + 63, // Max response packet size + "br|rrrr", // Format string + // === REQUEST ================================ + 0x1c, // b Get Connection Information + &ConnectionNum, 4, // r Connection Number + // === REPLY ================================== + pUserID, 4, // r Object ID + &ObjectType, 2, // r Object Type + UserName, 48, // r UserName + LoginTime, 7 // r Login Time + ); + } + else { + NtStatus = NwlibMakeNcp( + pServerInfo->hConn, // Connection Handle + FSCTL_NWR_NCP_E3H, // Bindery function + 4, // Max request packet size + 63, // Max response packet size + "bb|rrrr", // Format string + // === REQUEST ================================ + 0x16, // b Get Connection Information + ConnectionNum, // b Connection Number + // === REPLY ================================== + pUserID, 4, // r Object ID + &ObjectType, 2, // r Object Type + UserName, 48, // r UserName + LoginTime, 7 // r Login Time + ); + } + + return NtStatus; +} + +/******************************************************************** + + GetConnectionNumber + +Routine Description: + + Given a ConnectionHandle, return the NetWare Connection number + +Arguments: + + ConnectionHandle - Connection Handle + pConnectionNumber - pointer to returned connection number + +Return Value: + 0 = success + else NT error + + *******************************************************************/ +unsigned int +GetConnectionNumber( + unsigned int ConnectionHandle, + unsigned int * pConnectionNumber ) +{ + NTSTATUS Status; + IO_STATUS_BLOCK IoStatusBlock; + NWR_GET_CONNECTION_DETAILS Details; + PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)ConnectionHandle ; + + Status = NtFsControlFile( + pServerInfo->hConn, // Connection Handle + NULL, + NULL, + NULL, + &IoStatusBlock, + FSCTL_NWR_GET_CONN_DETAILS, + NULL, + 0, + (PVOID) &Details, + sizeof(Details)); + + if (Status == STATUS_SUCCESS) { + Status = IoStatusBlock.Status; + } + + if (NT_SUCCESS(Status)) { + *pConnectionNumber = 256 * Details.ConnectionNumberHi + + Details.ConnectionNumberLo; + } + + return Status; +} + +/******************************************************************** + + GetInternetAddress + +Routine Description: + + Return the address of the current system + +Arguments: + + ConnectionHandle - Connection Handle + ConnectionNum - Connection Number + pAddress - returned address + +Return Value: + 0 = success + else NT error + + *******************************************************************/ +unsigned int +GetInternetAddress( + unsigned int ConnectionHandle, + unsigned int ConnectionNum, + unsigned char *pAddress + ) +{ + NTSTATUS NtStatus ; + VERSION_INFO VerInfo; + unsigned int Version; + unsigned char Address[12]; + PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)ConnectionHandle ; + + NtStatus = NWGetFileServerVersionInfo( (NWCONN_HANDLE)ConnectionHandle, + &VerInfo ); + + if (!NT_SUCCESS(NtStatus)) + return NtStatus; + + Version = VerInfo.Version * 1000 + VerInfo.SubVersion * 10; + + if ( ( Version >= 3110 ) || ( Version < 2000 ) ) { + NtStatus = NwlibMakeNcp( + pServerInfo->hConn, // Connection Handle + FSCTL_NWR_NCP_E3H, // Bindery function + 7, // Max request packet size + 14, // Max response packet size + "br|r", // Format string + // === REQUEST ================================ + 0x1a, // b Get Connection Information + &ConnectionNum, 4, // r Connection Number + // === REPLY ================================== + Address, 12 // r Login Time + ); + } + else { + NtStatus = NwlibMakeNcp( + pServerInfo->hConn, // Connection Handle + FSCTL_NWR_NCP_E3H, // Bindery function + 4, // Max request packet size + 14, // Max response packet size + "bb|r", // Format string + // === REQUEST ================================ + 0x13, // b Get Connection Information + (unsigned char)ConnectionNum, // b Connection Number + // === REPLY ================================== + Address, 12 // r Login Time + ); + } + memcpy( pAddress, Address, 10 ); + + return NtStatus; +} + + +/******************************************************************** + + GetBinderyObjectID + +Routine Description: + + Get the object ID of a named object in the bindery + +Arguments: + + ConnectionHandle - Server connection handle + pObjectName - Name of object + ObjectType - Object type + pObjectId - returned object ID + + +Return Value: + 0 = success + else NT error + + *******************************************************************/ +unsigned int +GetBinderyObjectID( + unsigned int ConnectionHandle, + char *pObjectName, + unsigned short ObjectType, + unsigned long *pObjectId ) +{ + PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)ConnectionHandle ; + unsigned int reply; + + reply = NwlibMakeNcp( + pServerInfo->hConn, // Connection Handle + FSCTL_NWR_NCP_E3H, // Directory function + 54, // Max request packet size + 56, // Max response packet size + "brp|r", // Format string + // === REQUEST ================================ + 0x35, // b Get object ID + &ObjectType, W_SIZE, // r Object type HI-LO + pObjectName, // p UserName + // === REPLY ================================== + pObjectId, 4 // 4 bytes of raw data + ); + return reply; +} + +/******************************************************************** + + GetDefaultPrinterQueue + +Routine Description: + + Get the default printer queue. + +Arguments: + ConnectionHandle - IN + Handle to server + pServerName - IN + File server name + pQueueName - OUT + Default printer queue name + + +Return Value: + + *******************************************************************/ +unsigned int +GetDefaultPrinterQueue ( + unsigned int ConnectionHandle, + unsigned char *pServerName, + unsigned char *pQueueName + ) +{ + unsigned long ObjectID; + NTSTATUS NtStatus ; + PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)ConnectionHandle ; + NWOBJ_TYPE ObjectType; + NWCCODE Nwcode; + + NtStatus = NwlibMakeNcp( + pServerInfo->hConn, // Connection Handle + NWR_ANY_F2_NCP(0x11), // F2 Function function + 4, // Max request packet size + 4, // Max response packet size + "wbb|d", // Format string + // === REQUEST ================================ + 0x2, // w Length + 0xA, // b Subfunction + 0, // b printer number + // === REPLY ================================== + &ObjectID // d Object ID of Queue + ); + + if ( !NT_SUCCESS( NtStatus ) ) + return ( NtStatus & 0xFF ); + + Nwcode = NWGetObjectName( (NWCONN_HANDLE) ConnectionHandle, + ObjectID, + pQueueName, + &ObjectType ); + + return Nwcode; +} |