summaryrefslogtreecommitdiffstats
path: root/private/nw/nwlib/nwpapi32.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/nw/nwlib/nwpapi32.c')
-rw-r--r--private/nw/nwlib/nwpapi32.c1011
1 files changed, 1011 insertions, 0 deletions
diff --git a/private/nw/nwlib/nwpapi32.c b/private/nw/nwlib/nwpapi32.c
new file mode 100644
index 000000000..030593a71
--- /dev/null
+++ b/private/nw/nwlib/nwpapi32.c
@@ -0,0 +1,1011 @@
+/*++
+
+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
+//
+
+extern NTSTATUS
+NwAttachToServer(
+ IN LPWSTR ServerName,
+ OUT LPHANDLE phandleServer
+ ) ;
+
+extern NTSTATUS
+NwDetachFromServer(
+ IN HANDLE handleServer
+ ) ;
+
+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 ;
+
+ 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;
+}