658 lines
14 KiB
C
658 lines
14 KiB
C
/*++
|
||
|
||
Copyright (c) 1989 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
smbprocs.h
|
||
|
||
Abstract:
|
||
|
||
This module defines functions for processing SMBs.
|
||
|
||
Author:
|
||
|
||
Chuck Lenzmeier (chuckl) 5-Oct-1989
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#ifndef _SMBPROCS_
|
||
#define _SMBPROCS_
|
||
|
||
//#include <ntos.h>
|
||
|
||
//#include "srvblock.h"
|
||
|
||
|
||
//
|
||
// SMB processing routine definiton. SMB_PROCESSOR_PARAMETERS is used
|
||
// to declare SMB processing routines. It reduces the changes that
|
||
// have to be made if the definition changes. SMB_PROCESSOR_ARGUMENTS
|
||
// is used by one SMB processor to call another.
|
||
//
|
||
//
|
||
|
||
#define SMB_PROCESSOR_PARAMETERS \
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
|
||
#define SMB_PROCESSOR_ARGUMENTS \
|
||
WorkContext
|
||
|
||
#define SMB_PROCESSOR_RETURN_TYPE SMB_STATUS SRVFASTCALL
|
||
#define SMB_PROCESSOR_RETURN_LOCAL SMB_STATUS
|
||
|
||
//
|
||
// SMB processor return status.
|
||
//
|
||
|
||
typedef enum _SMB_STATUS {
|
||
SmbStatusMoreCommands,
|
||
SmbStatusSendResponse,
|
||
SmbStatusNoResponse,
|
||
SmbStatusInProgress
|
||
} SMB_STATUS, *PSMB_STATUS;
|
||
|
||
//
|
||
// SMB transaction processor return status.
|
||
//
|
||
|
||
typedef enum _SMB_TRANS_STATUS {
|
||
SmbTransStatusSuccess,
|
||
SmbTransStatusErrorWithData,
|
||
SmbTransStatusErrorWithoutData,
|
||
SmbTransStatusInProgress
|
||
} SMB_TRANS_STATUS, *PSMB_TRANS_STATUS;
|
||
|
||
|
||
typedef
|
||
SMB_STATUS
|
||
(SRVFASTCALL *PSMB_PROCESSOR) (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
The SMB_PROCESSOR is a routine that is called to process a specific
|
||
SMB command.
|
||
|
||
Arguments:
|
||
|
||
WorkContext - Supplies the address of a Work Context Block
|
||
describing the current request. In particular, the following
|
||
fields are valid:
|
||
|
||
RequestHeader - Address of the request SMB header.
|
||
|
||
RequestParameters - Address of the current command's request
|
||
parameters. The SMB processor should update this field to
|
||
point to the next command in the SMB, if any.
|
||
|
||
ResponseHeader - Address of the response SMB header. Initially,
|
||
this is a copy of the request header. As return data, such
|
||
as UID, TID, and FID, becomes available, it should be
|
||
written into both the request header (for AndX command
|
||
processors) and the response header (for the client). Note
|
||
that the response header address *may* be the same as the
|
||
request header address.
|
||
|
||
ResponseParameters - Address of the current command's response
|
||
parameters. The SMB processor should write the response
|
||
data to this address, then update the pointer to point to
|
||
the address of the next command's response area, if any.
|
||
If there are no more commands in the SMB, this field should
|
||
be set to point to the first byte after the response so that
|
||
the length of the response can be computed.
|
||
|
||
Endpoint, Connection - Addresses of the endpoint and the
|
||
connection that received the SMB. These fields should not
|
||
be changed by the SMB processor. Other block pointers in
|
||
WorkContext (Share, Session, TreeConnect, and Rfcb) may be
|
||
set by the SMB processor if such blocks are referenced
|
||
during processing. Any non-NULL pointers in these fields
|
||
are dereferenced when SMB processing is complete, before the
|
||
response (if any) is sent. The Connection and Endpoint
|
||
pointers are not cleared until the WorkContext is requeued
|
||
to the receive queue.
|
||
|
||
Parameters - This union is used by the various SMB processors to
|
||
retain state during asynchronous operations.
|
||
|
||
Return Value:
|
||
|
||
SMB_STATUS - Indicates the action to be taken by the calling routine.
|
||
Possible values are the following:
|
||
|
||
SmbStatusMoreCommands - There is at least one more AndX
|
||
follow-on command in the request SMB. The SMB processor has
|
||
updated RequestParameters and ResponseParameters in
|
||
WorkContext to point to the next command's request and
|
||
response areas. It has also copied the command code of
|
||
the next command into RequestHeader->Command, so that
|
||
SrvProcessSmb can dispatch the next request.
|
||
|
||
SmbStatusSendResponse - Processing of the request is complete,
|
||
and a response is to be sent. ResponseParameters has been
|
||
updated to point to the first location *after* the end of
|
||
the response. This is used to compute the length of the
|
||
response.
|
||
|
||
SmbStatusNoResponse - Processing of the request is complete, but
|
||
either no response is needed or the SMB processor has
|
||
already taken care of sending the response(s).
|
||
|
||
SmbStatusInProgress - The SMB processor has started an
|
||
asynchronous operation and will continue processing the SMB
|
||
at an appropriate restart routine when the operation
|
||
completes. The restart routine, after updating WorkContext,
|
||
calls SrvSmbProcessSmb to continue (or end) processing the
|
||
SMB.
|
||
|
||
--*/
|
||
|
||
|
||
typedef
|
||
SMB_TRANS_STATUS
|
||
(*PSMB_TRANSACTION_PROCESSOR) (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
The SMB_TRANSACTION_PROCESSOR is a routine that is called to process
|
||
a specific Transaction or Transaction2 SMB subfunction.
|
||
|
||
Arguments:
|
||
|
||
WorkContext - Supplies the address of a Work Context Block
|
||
describing the current request. In particular, the following
|
||
fields are valid and intended for use by the transaction
|
||
processor:
|
||
|
||
ResponseHeader - Address of the response SMB header. Initially,
|
||
this is a copy of the request header. The transaction
|
||
processor may update the error class and code fields if it
|
||
encounters an error.
|
||
|
||
Parameters.Transacton - Points to the transaction block
|
||
describing the transaction. All block pointer fields
|
||
(Connection, Session, TreeConnect) in the block are valid.
|
||
Pointers to the setup words and parameter and data bytes,
|
||
and the lengths of these items, are valid. The transaction
|
||
block is on the connection's pending transaction list.
|
||
|
||
The transaction processor must update the transaction block
|
||
to indicate how much data to return.
|
||
|
||
Return Value:
|
||
|
||
BOOLEAN - Indicates whether an error occurred. FALSE indicates that
|
||
the operation was successful, and that the data counts were
|
||
updated to indicate how much data to return. TRUE indicates
|
||
that an error occurred, and that SrvSetSmbError was called to
|
||
update the response header and place a null parameters field at
|
||
the end of the response.
|
||
|
||
--*/
|
||
|
||
|
||
//
|
||
// SMB Processing routines.
|
||
//
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbNotImplemented (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbCreateDirectory (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbDeleteDirectory (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbOpen (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbCreate (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbClose (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbFlush (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbDelete (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbRename (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbQueryInformation (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbSetInformation (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbRead (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbWrite (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbLockByteRange (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbUnlockByteRange (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbCreateTemporary (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbCreateNew (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbCheckDirectory (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbProcessExit (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbSeek (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbLockAndRead (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbReadRaw (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbReadMpx (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbWriteRaw (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbWriteMpx (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbWriteMpxSecondary (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbSetInformation2 (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbQueryInformation2 (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbLockingAndX (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbTransaction (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbTransactionSecondary (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbNtTransaction (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbNtTransactionSecondary (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbNtCreateAndX (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbIoctl (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbIoctlSecondary (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbMove (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbEcho (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbWriteAndClose (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbOpenAndX (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbReadAndX (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbWriteAndX (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbCloseAndTreeDisc (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbFindClose2 (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbFindNotifyClose (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbTreeConnect (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbTreeDisconnect (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbNegotiate (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbSessionSetupAndX (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbLogoffAndX (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbTreeConnectAndX (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbQueryInformationDisk (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbSearch (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbOpenPrintFile (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbClosePrintFile (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbGetPrintQueue (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
SMB_PROCESSOR_RETURN_TYPE
|
||
SrvSmbNtCancel (
|
||
SMB_PROCESSOR_PARAMETERS
|
||
);
|
||
|
||
//
|
||
// Transaction SMB processors
|
||
//
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbOpen2 (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbFindFirst2 (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbFindNext2 (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbQueryFsInformation (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbSetFsInformation (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbQueryPathInformation (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbSetPathInformation (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbQueryFileInformation (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbSetFileInformation (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbFsctl (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbIoctl2 (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbFindNotify (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbCreateDirectory2 (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbCreateWithSdOrEa (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbNtIoctl (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbNtNotifyChange (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbNtRename (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbQuerySecurityDescriptor (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbSetSecurityDescriptor (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbQueryQuota (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbSetQuota (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvTransactionNotImplemented (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
//
|
||
// Dfs transactions and support routines
|
||
//
|
||
VOID
|
||
SrvInitializeDfs();
|
||
|
||
VOID
|
||
SrvTerminateDfs();
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbGetDfsReferral (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
SMB_TRANS_STATUS
|
||
SrvSmbReportDfsInconsistency (
|
||
IN OUT PWORK_CONTEXT WorkContext
|
||
);
|
||
|
||
NTSTATUS SRVFASTCALL
|
||
DfsNormalizeName(
|
||
IN PSHARE Share,
|
||
IN PUNICODE_STRING RelatedPath OPTIONAL,
|
||
IN BOOLEAN StripLastComponent,
|
||
IN OUT PUNICODE_STRING String
|
||
);
|
||
|
||
NTSTATUS SRVFASTCALL
|
||
DfsFindShareName(
|
||
IN PUNICODE_STRING ShareName
|
||
);
|
||
|
||
VOID SRVFASTCALL
|
||
SrvIsShareInDfs(
|
||
IN PSHARE Share,
|
||
OUT BOOLEAN *IsDfs,
|
||
OUT BOOLEAN *IsDfsRoot
|
||
);
|
||
|
||
|
||
#if DBG
|
||
VOID
|
||
SrvValidateCompressedData(
|
||
PWORK_CONTEXT WorkContext,
|
||
PMDL CompressedDataMdl,
|
||
PCOMPRESSED_DATA_INFO Cdi
|
||
);
|
||
#endif
|
||
|
||
#endif // def _SMBPROCS_
|
||
|