357 lines
11 KiB
C
357 lines
11 KiB
C
|
|
||
|
/*************************************************************************
|
||
|
*
|
||
|
* 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;
|
||
|
}
|