|
|
/*++
Copyright (C) 1993 Microsoft Corporation
Module Name:
NWAPI32.C
Abstract:
This module contains several useful functions. Mostly wrappers.
Author:
Chuck Y. Chan (ChuckC) 06-Mar-1995
Revision History: --*/
#include "procs.h"
//
// Define structure for internal use. Our handle passed back from attach to
// file server will be pointer to this. We keep server string around for
// discnnecting from the server on logout. The structure is freed on detach.
// Callers should not use this structure but treat pointer as opaque handle.
//
typedef struct _NWC_SERVER_INFO { HANDLE hConn ; UNICODE_STRING ServerString ; } NWC_SERVER_INFO, *PNWC_SERVER_INFO ;
//
// forward declare
//
#ifndef WIN95
extern NTSTATUS NwAttachToServer( IN LPWSTR ServerName, OUT LPHANDLE phandleServer ) ;
extern NTSTATUS NwDetachFromServer( IN HANDLE handleServer ) ;
#endif
extern DWORD CancelAllConnections( LPWSTR pszServer ) ;
extern DWORD szToWide( LPWSTR lpszW, LPCSTR lpszC, INT nSize );
NTSTATUS NWPAttachToFileServerW( const WCHAR *pszServerName, NWLOCAL_SCOPE ScopeFlag, NWCONN_HANDLE *phNewConn ) { NTSTATUS NtStatus; LPWSTR lpwszServerName; // Pointer to buffer for WIDE servername
int nSize; PNWC_SERVER_INFO pServerInfo = NULL;
UNREFERENCED_PARAMETER(ScopeFlag) ;
//
// check parameters and init return result to be null.
//
if (!pszServerName || !phNewConn) return STATUS_INVALID_PARAMETER;
*phNewConn = NULL ;
//
// Allocate a buffer to store the file server name
//
nSize = wcslen(pszServerName)+3 ; if(!(lpwszServerName = (LPWSTR) LocalAlloc( LPTR, nSize * sizeof(WCHAR) ))) { NtStatus = STATUS_NO_MEMORY; goto ExitPoint ; } wcscpy( lpwszServerName, L"\\\\" ); wcscat( lpwszServerName, pszServerName );
//
// Allocate a buffer for the server info (handle + name pointer). Also
// init the unicode string.
//
if( !(pServerInfo = (PNWC_SERVER_INFO) LocalAlloc( LPTR, sizeof(NWC_SERVER_INFO))) ) { NtStatus = STATUS_NO_MEMORY; goto ExitPoint ; } RtlInitUnicodeString(&pServerInfo->ServerString, lpwszServerName) ;
//
// Call createfile to get a handle for the redirector calls
//
NtStatus = NwAttachToServer( lpwszServerName, &pServerInfo->hConn );
ExitPoint:
//
// Free the memory allocated above before exiting
//
if ( !NT_SUCCESS( NtStatus)) { if (lpwszServerName) (void) LocalFree( (HLOCAL) lpwszServerName ); if (pServerInfo) (void) LocalFree( (HLOCAL) pServerInfo ); } else *phNewConn = (HANDLE) pServerInfo ;
return( NtStatus ); }
NTSTATUS NWPDetachFromFileServer( NWCONN_HANDLE hConn ) { PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
(void) NwDetachFromServer( pServerInfo->hConn );
(void) LocalFree (pServerInfo->ServerString.Buffer) ;
//
// catch any body that still trirs to use this puppy...
//
pServerInfo->ServerString.Buffer = NULL ; pServerInfo->hConn = NULL ;
(void) LocalFree (pServerInfo) ;
return STATUS_SUCCESS; }
NTSTATUS NWPGetFileServerVersionInfo( NWCONN_HANDLE hConn, VERSION_INFO *lpVerInfo ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
3, // Max request packet size
130, // Max response packet size
"b|r", // Format string
// === REQUEST ================================
0x11, // b Get File Server Information
// === REPLY ==================================
lpVerInfo, // r File Version Structure
sizeof(VERSION_INFO) );
// Convert HI-LO words to LO-HI
// ===========================================================
lpVerInfo->ConnsSupported = wSWAP( lpVerInfo->ConnsSupported ); lpVerInfo->connsInUse = wSWAP( lpVerInfo->connsInUse ); lpVerInfo->maxVolumes = wSWAP( lpVerInfo->maxVolumes ); lpVerInfo->PeakConns = wSWAP( lpVerInfo->PeakConns ); return NtStatus; }
NTSTATUS NWPGetObjectName( NWCONN_HANDLE hConn, NWOBJ_ID dwObjectID, char *pszObjName, NWOBJ_TYPE *pwObjType ) { NWOBJ_ID dwRetID; NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
7, // Max request packet size
56, // Max response packet size
"br|rrr", // Format string
// === REQUEST ================================
0x36, // b Get Bindery Object Name
&dwObjectID,DW_SIZE, // r Object ID HI-LO
// === REPLY ==================================
&dwRetID,DW_SIZE, // r Object ID HI-LO
pwObjType,W_SIZE, // r Object Type
pszObjName,48 // r Object Name
);
return NtStatus; }
DWORD NWPLoginToFileServerW( NWCONN_HANDLE hConn, LPWSTR pszUserNameW, NWOBJ_TYPE wObjType, LPWSTR pszPasswordW ) { NETRESOURCEW NetResource; DWORD dwRes; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
//
// validate parameters
//
if (!hConn || !pszUserNameW || !pszPasswordW) return ERROR_INVALID_PARAMETER;
NetResource.dwScope = 0 ; NetResource.dwUsage = 0 ; NetResource.dwType = RESOURCETYPE_ANY; NetResource.lpLocalName = NULL; NetResource.lpRemoteName = (LPWSTR) pServerInfo->ServerString.Buffer; NetResource.lpComment = NULL; NetResource.lpProvider = NULL ;
//
// make the connection
//
dwRes=NPAddConnection ( &NetResource, pszPasswordW, pszUserNameW );
if( NO_ERROR != dwRes ) dwRes = GetLastError();
return( dwRes ); }
DWORD NWPLogoutFromFileServer( NWCONN_HANDLE hConn ) { DWORD dwRes; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
//
// now cancel the any connection to \\servername.
//
dwRes = NPCancelConnection( pServerInfo->ServerString.Buffer, TRUE );
if ( NO_ERROR != dwRes ) dwRes = GetLastError();
return dwRes; }
NTSTATUS NWPReadPropertyValue( NWCONN_HANDLE hConn, const char *pszObjName, NWOBJ_TYPE wObjType, char *pszPropName, unsigned char ucSegment, char *pValue, NWFLAGS *pucMoreFlag, NWFLAGS *pucPropFlag ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
70, // Max request packet size
132, // Max response packet size
"brpbp|rbb", // Format string
// === REQUEST ================================
0x3D, // b Read Property Value
&wObjType,W_SIZE, // r Object Type HI-LO
pszObjName, // p Object Name
ucSegment, // b Segment Number
pszPropName, // p Property Name
// === REPLY ==================================
pValue,128, // r Property value
pucMoreFlag, // b More Flag
pucPropFlag // b Prop Flag
);
return NtStatus; }
NTSTATUS NWPScanObject( NWCONN_HANDLE hConn, const char *pszSearchName, NWOBJ_TYPE wObjSearchType, NWOBJ_ID *pdwObjectID, char *pszObjectName, NWOBJ_TYPE *pwObjType, NWFLAGS *pucHasProperties, NWFLAGS *pucObjectFlags, NWFLAGS *pucObjSecurity ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
57, // Max request packet size
59, // Max response packet size
"brrp|rrrbbb", // Format string
// === REQUEST ================================
0x37, // b Scan bindery object
pdwObjectID,DW_SIZE, // r 0xffffffff to start or last returned ID when enumerating HI-LO
&wObjSearchType,W_SIZE, // r Use OT_??? Defines HI-LO
pszSearchName, // p Search Name. (use "*") for all
// === REPLY ==================================
pdwObjectID,DW_SIZE, // r Returned ID HI-LO
pwObjType,W_SIZE, // r rObject Type HI-LO
pszObjectName,48, // r Found Name
pucObjectFlags, // b Object Flag
pucObjSecurity, // b Object Security
pucHasProperties // b Has Properties
);
return NtStatus; }
NTSTATUS NWPScanProperty( NWCONN_HANDLE hConn, const char *pszObjectName, NWOBJ_TYPE wObjType, char *pszSearchName, NWOBJ_ID *pdwSequence, char *pszPropName, NWFLAGS *pucPropFlags, NWFLAGS *pucPropSecurity, NWFLAGS *pucHasValue, NWFLAGS *pucMore ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
73, // Max request packet size
26, // Max response packet size
"brprp|rbbrbb", // Format string
// === REQUEST ================================
0x3C, // b Scan Prop function
&wObjType,W_SIZE, // r Type of Object
pszObjectName, // p Object Name
pdwSequence,DW_SIZE, // r Sequence HI-LO
pszSearchName, // p Property Name to Search for
// === REPLY ==================================
pszPropName,16, // r Returned Property Name
pucPropFlags, // b Property Flags
pucPropSecurity, // b Property Security
pdwSequence,DW_SIZE, // r Sequence HI-LO
pucHasValue, // b Property Has value
pucMore // b More Properties
);
return NtStatus; }
NTSTATUS NWPDeleteObject( NWCONN_HANDLE hConn, const char *pszObjectName, NWOBJ_TYPE wObjType ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
54, // Max request packet size
2, // Max response packet size
"brp|", // Format string
// === REQUEST ================================
0x33, // b Scan Prop function
&wObjType,W_SIZE, // r Type of Object
pszObjectName // p Object Name
// === REPLY ==================================
);
return NtStatus; }
NTSTATUS NWPCreateObject( NWCONN_HANDLE hConn, const char *pszObjectName, NWOBJ_TYPE wObjType, NWFLAGS ucObjectFlags, NWFLAGS ucObjSecurity ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
56, // Max request packet size
2, // Max response packet size
"bbbrp|", // Format string
// === REQUEST ================================
0x32, // b Scan Prop function
ucObjectFlags, // b Object flags
ucObjSecurity, // b Object security
&wObjType,W_SIZE, // r Type of Object
pszObjectName // p Object Name
// === REPLY ==================================
);
return NtStatus; }
NTSTATUS NWPCreateProperty( NWCONN_HANDLE hConn, const char *pszObjectName, NWOBJ_TYPE wObjType, const char *pszPropertyName, NWFLAGS ucObjectFlags, NWFLAGS ucObjSecurity ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
73, // Max request packet size
2, // Max response packet size
"brpbbp|", // Format string
// === REQUEST ================================
0x39, // b Create Prop function
&wObjType,W_SIZE, // r Type of Object
pszObjectName, // p Object Name
ucObjectFlags, // b Object flags
ucObjSecurity, // b Object security
pszPropertyName // p Property Name
// === REPLY ==================================
);
return NtStatus; }
NTSTATUS NWPDeleteProperty( NWCONN_HANDLE hConn, const char *pszObjectName, NWOBJ_TYPE wObjType, const char *pszPropertyName ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
73, // Max request packet size
2, // Max response packet size
"brpp|", // Format string
// === REQUEST ================================
0x3A, // b Delete Prop function
&wObjType,W_SIZE, // r Type of Object
pszObjectName, // p Object Name
pszPropertyName // p Property Name
// === REPLY ==================================
);
return NtStatus; }
NTSTATUS NWPWritePropertyValue( NWCONN_HANDLE hConn, const char *pszObjectName, NWOBJ_TYPE wObjType, const char *pszPropertyName, NWSEGMENT_NUM segmentNumber, NWSEGMENT_DATA *segmentData, NWFLAGS moreSegments ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
201, // Max request packet size
2, // Max response packet size
"brpbbpr|", // Format string
// === REQUEST ================================
0x3E, // b Write Prop function
&wObjType,W_SIZE, // r Type of Object
pszObjectName, // p Object Name
segmentNumber, // b Segment Number
moreSegments, // b Segment remaining
pszPropertyName, // p Property Name
segmentData, 128 // r Property Value Data
// === REPLY ==================================
);
return NtStatus; }
NTSTATUS NWPChangeObjectPasswordEncrypted( NWCONN_HANDLE hConn, const char *pszObjectName, NWOBJ_TYPE wObjType, BYTE *validationKey, BYTE *newKeyedPassword ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
strlen( pszObjectName) + 32, // Max request packet size
2, // Max response packet size
"brrpr|", // Format string
// === REQUEST ================================
0x4B, // b Write Prop function
validationKey, 8, // r Key
&wObjType,W_SIZE, // r Type of Object
pszObjectName, // p Object Name
newKeyedPassword, 17 // r New Keyed Password
// === REPLY ==================================
);
return NtStatus; }
NTSTATUS NWPGetObjectID( NWCONN_HANDLE hConn, const char *pszObjectName, NWOBJ_TYPE wObjType, NWOBJ_ID *objectID ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
54, // Max request packet size
56, // Max response packet size
"brp|d", // Format string
// === REQUEST ================================
0x35, // b Get Obj ID
&wObjType,W_SIZE, // r Type of Object
pszObjectName, // p Object Name
// === REPLY ==================================
objectID // d Object ID
);
*objectID = dwSWAP( *objectID );
return NtStatus; }
NTSTATUS NWPRenameBinderyObject( NWCONN_HANDLE hConn, const char *pszObjectName, const char *pszNewObjectName, NWOBJ_TYPE wObjType ) { NTSTATUS NtStatus; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
105, // Max request packet size
2, // Max response packet size
"brpp", // Format string
// === REQUEST ================================
0x34, // b Rename bindery object
&wObjType,W_SIZE, // r Type of Object
pszObjectName, // p Object Name
pszNewObjectName // p New Object Name
// === REPLY ==================================
);
return NtStatus; }
NTSTATUS NWPAddObjectToSet( NWCONN_HANDLE hConn, const char *pszObjectName, NWOBJ_TYPE wObjType, const char *pszPropertyName, const char *pszMemberName, NWOBJ_TYPE memberType ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
122, // Max request packet size
2, // Max response packet size
"brpprp|", // Format string
// === REQUEST ================================
0x41, // b Add obj to set
&wObjType,W_SIZE, // r Type of Object
pszObjectName, // p Object Name
pszPropertyName, // p Property Name
&memberType, W_SIZE, // r Member type
pszMemberName // p Member Name
// === REPLY ==================================
);
return NtStatus; }
NTSTATUS NWPDeleteObjectFromSet( NWCONN_HANDLE hConn, const char *pszObjectName, NWOBJ_TYPE wObjType, const char *pszPropertyName, const char *pszMemberName, NWOBJ_TYPE memberType ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
122, // Max request packet size
2, // Max response packet size
"brpprp|", // Format string
// === REQUEST ================================
0x42, // b Del object from set
&wObjType,W_SIZE, // r Type of Object
pszObjectName, // p Object Name
pszPropertyName, // p Property Name
&memberType, W_SIZE, // r Member type
pszMemberName // p Member Name
// === REPLY ==================================
);
return NtStatus; }
NTSTATUS NWPGetChallengeKey( NWCONN_HANDLE hConn, UCHAR *challengeKey ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
3, // Max request packet size
10, // Max response packet size
"b|r", // Format string
// === REQUEST ================================
0x17, // b Get Challenge
// === REPLY ==================================
challengeKey, 8 );
return NtStatus; }
NTSTATUS NWPCreateDirectory( NWCONN_HANDLE hConn, NWDIR_HANDLE dirHandle, const char *pszPath, NWACCESS_RIGHTS accessMask ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E2H, // Bindery function
261, // Max request packet size
2, // Max response packet size
"bbbp|", // Format string
// === REQUEST ================================
0xA, // b Create Directory
dirHandle, // b Directory Handle
accessMask, // b Access Mask
pszPath // p Property Name
// === REPLY ==================================
);
return NtStatus; }
NTSTATUS NWPAddTrustee( NWCONN_HANDLE hConn, NWDIR_HANDLE dirHandle, const char *pszPath, NWOBJ_ID dwTrusteeID, NWRIGHTS_MASK rightsMask ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E2H, // Directory function
266, // Max request packet size
2, // Max response packet size
"bbrrp|", // Format string
// === REQUEST ================================
0x27, // b Add trustee to directory
dirHandle, // b Directory handle
&dwTrusteeID,DW_SIZE, // r Object ID to assigned to directory
&rightsMask,W_SIZE, // r User rights for directory
pszPath // p Directory (if dirHandle = 0 then vol:directory)
);
return NtStatus;
}
NTSTATUS NWPScanForTrustees( NWCONN_HANDLE hConn, NWDIR_HANDLE dirHandle, char *pszsearchDirPath, NWSEQUENCE *pucsequenceNumber, BYTE *numberOfEntries, TRUSTEE_INFO *ti ) { ULONG i; DWORD oid[20]; WORD or[20]; NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E2H, // Bindery function
261, // Max request packet size
121, // Max response packet size
"bbbp|brr", // Format string
// === REQUEST ================================
0x26, // b Scan For Trustees
dirHandle, // b Directory Handle
*pucsequenceNumber, // b Sequence Number
pszsearchDirPath, // p Search Dir Path
// === REPLY ==================================
numberOfEntries, &oid[0],DW_SIZE*20, // r trustee object ID
&or[0], W_SIZE*20 // b Trustee rights mask
);
for(i = 0; i < 20; i++) { ti[i].objectID = oid[i]; ti[i].objectRights = or[i]; }
(*pucsequenceNumber)++; return NtStatus ;
} // NWScanForTrustees
NTSTATUS NWPScanDirectoryForTrustees2( NWCONN_HANDLE hConn, NWDIR_HANDLE dirHandle, char *pszsearchDirPath, NWSEQUENCE *pucsequenceNumber, char *pszdirName, NWDATE_TIME *dirDateTime, NWOBJ_ID *ownerID, TRUSTEE_INFO *ti ) { ULONG i; DWORD oid[5]; BYTE or[5]; NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
memset(oid, 0, sizeof(oid)); memset(or, 0, sizeof(or));
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E2H, // Bindery function
261, // Max request packet size
49, // Max response packet size
"bbbp|rrrrr", // Format string
// === REQUEST ================================
0x0C, // b Scan Directory function
dirHandle, // b Directory Handle
*pucsequenceNumber, // b Sequence Number
pszsearchDirPath, // p Search Dir Path
// === REPLY ==================================
pszdirName,16, // r Returned Directory Name
dirDateTime,DW_SIZE, // r Date and Time
ownerID,DW_SIZE, // r Owner ID
&oid[0],DW_SIZE*5, // r trustee object ID
&or[0], 5 // b Trustee rights mask
);
for(i = 0; i < 5; i++) { ti[i].objectID = oid[i]; ti[i].objectRights = (WORD) or[i]; }
(*pucsequenceNumber)++; return NtStatus ;
} // NWScanDirectoryForTrustees2
NTSTATUS NWPGetBinderyAccessLevel( NWCONN_HANDLE hConn, NWFLAGS *accessLevel, NWOBJ_ID *objectID ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
3, // Max request packet size
7, // Max response packet size
"b|br", // Format string
// === REQUEST ================================
0x46, // b Get Bindery Access Level
// === REPLY ==================================
accessLevel, objectID,DW_SIZE );
return NtStatus ;
} // NWGetBinderyAccessLevel
NTSTATUS NWPGetFileServerDescription( NWCONN_HANDLE hConn, char *pszCompany, char *pszVersion, char *pszRevision ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E3H, // Bindery function
3, // Max request packet size
514, // Max response packet size
"b|ccc", // Format string
// === REQUEST ================================
0xC9, // b Get File Server Information
// === REPLY ==================================
pszCompany, // c Company
pszVersion, // c Version
pszRevision // c Description
);
return NtStatus; }
NTSTATUS NWPGetVolumeNumber( NWCONN_HANDLE hConn, char *pszVolume, NWVOL_NUM *VolumeNumber ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E2H, // Bindery function
20, // Max request packet size
3, // Max response packet size
"bp|b", // Format string
// === REQUEST ================================
0x05, // b Get Volume Number
pszVolume, // p volume name
// === REPLY ==================================
VolumeNumber // b Description
);
return NtStatus; }
NTSTATUS NWPGetVolumeUsage( NWCONN_HANDLE hConn, NWVOL_NUM VolumeNumber, DWORD *TotalBlocks, DWORD *FreeBlocks, DWORD *PurgeableBlocks, DWORD *NotYetPurgeableBlocks, DWORD *TotalDirectoryEntries, DWORD *AvailableDirectoryEntries, BYTE *SectorsPerBlock ) { NTSTATUS NtStatus ; PNWC_SERVER_INFO pServerInfo = (PNWC_SERVER_INFO)hConn ;
NtStatus = NwlibMakeNcp( pServerInfo->hConn, // Connection Handle
FSCTL_NWR_NCP_E2H, // Bindery function
4, // Max request packet size
46, // Max response packet size
"bb|dddddd==b", // Format string
// === REQUEST ================================
0x2C, // b Get Volume Number
VolumeNumber, // p volume number
// === REPLY ==================================
TotalBlocks, FreeBlocks, PurgeableBlocks, NotYetPurgeableBlocks, TotalDirectoryEntries, AvailableDirectoryEntries, SectorsPerBlock );
*TotalBlocks = dwSWAP( *TotalBlocks ); *FreeBlocks = dwSWAP( *FreeBlocks ); *PurgeableBlocks = dwSWAP( *PurgeableBlocks ); *NotYetPurgeableBlocks = dwSWAP( *NotYetPurgeableBlocks ); *TotalDirectoryEntries = dwSWAP( *TotalDirectoryEntries ); *AvailableDirectoryEntries = dwSWAP( *AvailableDirectoryEntries );
return NtStatus; }
|