smbmrxnp.c
来自「winddk src目录下的文件系统驱动源码压缩!」· C语言 代码 · 共 1,729 行 · 第 1/4 页
C
1,729 行
/*++
Copyright (c) 1989-1999 Microsoft Corporation
Module Name:
smbmrxnp.c
Abstract:
This module implements the routines required for interaction with network
provider router interface in NT
Notes:
This module has been builkt and tested only in UNICODE environment
--*/
#include <windows.h>
#include <windef.h>
#include <winbase.h>
#include <winsvc.h>
#include <winnetwk.h>
#include <npapi.h>
#include <lmwksta.h>
#include <devioctl.h>
// include files from the smb inc directory
#include <smbmrx.h>
#ifndef UNICODE_STRING
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
typedef UNICODE_STRING *PUNICODE_STRING;
#endif
#ifndef FILE_FULL_EA_INFORMATION
typedef struct _FILE_FULL_EA_INFORMATION {
ULONG NextEntryOffset;
UCHAR Flags;
UCHAR EaNameLength;
USHORT EaValueLength;
CHAR EaName[1];
} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
#endif
#define MAX_EA_NAME_LEN sizeof("UserName\0")
#define MAX_CONNECT_INFO_SIZE \
3 * sizeof(FILE_FULL_EA_INFORMATION) + \
sizeof(SMBMRX_CONNECTINFO) + \
4 * MAX_PATH + \
3 * MAX_EA_NAME_LEN
typedef struct _SMBMRXNP_ENUMERATION_HANDLE_ {
INT LastIndex;
} SMBMRXNP_ENUMERATION_HANDLE,
*PSMBMRXNP_ENUMERATION_HANDLE;
#ifdef DBG
#define DbgP(_x_) DbgPrint _x_
#else
#define DbgP(_x_)
#endif
ULONG _cdecl DbgPrint( LPTSTR Format, ... );
#define TRACE_TAG L"SMBMRXNP: "
// The debug level for this module
// the SMB mini redirector and provider name. The original constants
// are defined in smbmrx.h
UNICODE_STRING SmbMRxDeviceName = {
sizeof(DD_SMBMRX_FS_DEVICE_NAME_U),
sizeof(DD_SMBMRX_FS_DEVICE_NAME_U),
DD_SMBMRX_FS_DEVICE_NAME_U
};
UNICODE_STRING SmbMrxProviderName = {
sizeof(SMBMRX_PROVIDER_NAME_U),
sizeof(SMBMRX_PROVIDER_NAME_U),
SMBMRX_PROVIDER_NAME_U
};
DWORD
OpenSharedMemory(
PHANDLE phMutex,
PHANDLE phMemory,
PVOID *pMemory
)
/*++
Routine Description:
This routine opens the shared memory for exclusive manipulation
Arguments:
phMutex - the mutex handle
phMemory - the memory handle
pMemory - a ptr. to the shared memory which is set if successful
Return Value:
WN_SUCCESS -- if successful
--*/
{
DWORD dwStatus;
DbgP((TEXT("OpenSharedMemory\n")));
*phMutex = 0;
*phMemory = 0;
*pMemory = NULL;
*phMutex = OpenMutex(SYNCHRONIZE,
FALSE,
SMBMRXNP_MUTEX_NAME);
if (*phMutex == NULL)
{
dwStatus = GetLastError();
DbgP((TEXT("OpenSharedMemory: OpenMutex failed\n")));
goto OpenSharedMemoryAbort1;
}
DbgP((TEXT("OpenSharedMemory: Calling WaitForSingleObject\n")));
WaitForSingleObject(*phMutex, INFINITE);
*phMemory = OpenFileMapping(FILE_MAP_WRITE,
FALSE,
SMBMRXNP_SHARED_MEMORY_NAME);
if (*phMemory == NULL)
{
dwStatus = GetLastError();
DbgP((TEXT("OpenSharedMemory: OpenFileMapping failed\n")));
goto OpenSharedMemoryAbort2;
}
*pMemory = MapViewOfFile(*phMemory, FILE_MAP_WRITE, 0, 0, 0);
if (*pMemory == NULL)
{
dwStatus = GetLastError();
DbgP((TEXT("OpenSharedMemory: MapViewOfFile failed\n")));
goto OpenSharedMemoryAbort3;
}
DbgP((TEXT("OpenSharedMemory: return ERROR_SUCCESS\n")));
return ERROR_SUCCESS;
OpenSharedMemoryAbort3:
CloseHandle(*phMemory);
OpenSharedMemoryAbort2:
ReleaseMutex(*phMutex);
CloseHandle(*phMutex);
*phMutex = NULL;
OpenSharedMemoryAbort1:
DbgP((TEXT("OpenSharedMemory: return dwStatus: %d\n"), dwStatus));
return dwStatus;
}
VOID
CloseSharedMemory(
PHANDLE hMutex,
PHANDLE hMemory,
PVOID *pMemory )
/*++
Routine Description:
This routine relinquishes control of the shared memory after exclusive
manipulation
Arguments:
hMutex - the mutex handle
hMemory - the memory handle
pMemory - a ptr. to the shared memory which is set if successful
Return Value:
--*/
{
DbgP((TEXT("CloseSharedMemory\n")));
if (*pMemory)
{
UnmapViewOfFile(*pMemory);
*pMemory = NULL;
}
if (*hMemory)
{
CloseHandle(*hMemory);
*hMemory = 0;
}
if (*hMutex)
{
if (ReleaseMutex(*hMutex) == FALSE)
{
DbgP((TEXT("CloseSharedMemory: ReleaseMutex error: %d\n"), GetLastError()));
}
CloseHandle(*hMutex);
*hMutex = 0;
}
DbgP((TEXT("CloseSharedMemory: Return\n")));
}
DWORD APIENTRY
NPGetCaps(
DWORD nIndex )
/*++
Routine Description:
This routine returns the capabilities of the SMB Mini redirector
network provider implementation
Arguments:
nIndex - category of capabilities desired
Return Value:
the appropriate capabilities
--*/
{
switch (nIndex)
{
case WNNC_SPEC_VERSION:
return WNNC_SPEC_VERSION51;
case WNNC_NET_TYPE:
return WNNC_NET_RDR2_SAMPLE;
case WNNC_DRIVER_VERSION:
#define WNNC_DRIVER(major,minor) (major*0x00010000 + minor)
return WNNC_DRIVER(1, 0);
case WNNC_CONNECTION:
return WNNC_CON_GETCONNECTIONS | WNNC_CON_CANCELCONNECTION |
WNNC_CON_ADDCONNECTION | WNNC_CON_ADDCONNECTION3;
case WNNC_ENUMERATION:
return WNNC_ENUM_LOCAL;
case WNNC_START:
case WNNC_USER:
case WNNC_DIALOG:
case WNNC_ADMIN:
default:
return 0;
}
}
DWORD APIENTRY
NPLogonNotify(
PLUID lpLogonId,
LPCWSTR lpAuthentInfoType,
LPVOID lpAuthentInfo,
LPCWSTR lpPreviousAuthentInfoType,
LPVOID lpPreviousAuthentInfo,
LPWSTR lpStationName,
LPVOID StationHandle,
LPWSTR *lpLogonScript)
/*++
Routine Description:
This routine handles the logon notifications
Arguments:
lpLogonId -- the associated LUID
lpAuthenInfoType - the authentication information type
lpAuthenInfo - the authentication Information
lpPreviousAuthentInfoType - the previous aunthentication information type
lpPreviousAuthentInfo - the previous authentication information
lpStationName - the logon station name
LPVOID - logon station handle
lpLogonScript - the logon script to be executed.
Return Value:
WN_SUCCESS
Notes:
This capability has not been implemented in the sample.
--*/
{
*lpLogonScript = NULL;
return WN_SUCCESS;
}
DWORD APIENTRY
NPPasswordChangeNotify (
LPCWSTR lpAuthentInfoType,
LPVOID lpAuthentInfo,
LPCWSTR lpPreviousAuthentInfoType,
LPVOID lpPreviousAuthentInfo,
LPWSTR lpStationName,
LPVOID StationHandle,
DWORD dwChangeInfo )
/*++
Routine Description:
This routine handles the password change notifications
Arguments:
lpAuthenInfoType - the authentication information type
lpAuthenInfo - the authentication Information
lpPreviousAuthentInfoType - the previous aunthentication information type
lpPreviousAuthentInfo - the previous authentication information
lpStationName - the logon station name
LPVOID - logon station handle
dwChangeInfo - the password change information.
Return Value:
WN_NOT_SUPPORTED
Notes:
This capability has not been implemented in the sample.
--*/
{
SetLastError(WN_NOT_SUPPORTED);
return WN_NOT_SUPPORTED;
}
DWORD APIENTRY
NPOpenEnum(
DWORD dwScope,
DWORD dwType,
DWORD dwUsage,
LPNETRESOURCE lpNetResource,
LPHANDLE lphEnum )
/*++
Routine Description:
This routine opens a handle for enumeration of resources. The only capability
implemented in the sample is for enumerating connected shares
Arguments:
dwScope - the scope of enumeration
dwType - the type of resources to be enumerated
dwUsage - the usage parameter
lpNetResource - a pointer to the desired NETRESOURCE struct.
lphEnum - aptr. for passing nack the enumeration handle
Return Value:
WN_SUCCESS if successful, otherwise the appropriate error
Notes:
The sample only supports the notion of enumerating connected shares
The handle passed back is merely the index of the last entry returned
--*/
{
DWORD Status = 0;
DbgP((TEXT("NPOpenEnum\n")));
*lphEnum = NULL;
switch (dwScope)
{
case RESOURCE_CONNECTED:
{
*lphEnum = LocalAlloc(
LMEM_ZEROINIT,
sizeof(SMBMRXNP_ENUMERATION_HANDLE));
if (*lphEnum != NULL)
{
Status = WN_SUCCESS;
}
else
{
Status = WN_OUT_OF_MEMORY;
}
break;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?