📄 nulmrxnp.c
字号:
/*++
Copyright (c) 1989-1999 Microsoft Corporation
Module Name:
ifsmrxnp.c
Abstract:
This module implements the routines required for interaction with network
provider router interface in NT
Notes:
This module has been built 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 <devioctl.h>
#include "nulmrx.h"
#ifdef DBG
#define DbgP(_x_) WideDbgPrint _x_
#else
#define DbgP(_x_)
#endif
ULONG _cdecl WideDbgPrint( PWCHAR Format, ... );
#define TRACE_TAG L"NULMRXNP: "
#define WNNC_DRIVER( major, minor ) ( major * 0x00010000 + minor )
DWORD APIENTRY
NPGetCaps(
DWORD nIndex )
/*++
Routine Description:
This routine returns the capaboilities of the Null Mini redirector
network provider implementation
Arguments:
nIndex - category of capabilities desired
Return Value:
the appropriate capabilities
--*/
{
DWORD rc = 0;
DbgP(( L"GetNetCaps .....\n" ));
switch ( nIndex )
{
case WNNC_SPEC_VERSION:
rc = WNNC_SPEC_VERSION51;
break;
case WNNC_NET_TYPE:
rc = WNNC_NET_RDR2SAMPLE;
break;
case WNNC_DRIVER_VERSION:
rc = WNNC_DRIVER(1, 0);
break;
case WNNC_CONNECTION:
rc = WNNC_CON_GETCONNECTIONS |
WNNC_CON_CANCELCONNECTION |
WNNC_CON_ADDCONNECTION |
WNNC_CON_ADDCONNECTION3;
break;
case WNNC_ENUMERATION:
rc = WNNC_ENUM_LOCAL;
break;
case WNNC_START:
rc = 1;
break;
case WNNC_USER:
case WNNC_DIALOG:
case WNNC_ADMIN:
default:
rc = 0;
break;
}
return rc;
}
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;
}
ULONG
SendToMiniRdr(
IN ULONG IoctlCode,
IN PVOID InputDataBuf,
IN ULONG InputDataLen,
IN PVOID OutputDataBuf,
IN PULONG pOutputDataLen)
/*++
Routine Description:
This routine sends a device ioctl to the Mini Rdr.
Arguments:
IoctlCode - Function code for the Mini Rdr driver
InputDataBuf - Input buffer pointer
InputDataLen - Lenth of the input buffer
OutputDataBuf - Output buffer pointer
pOutputDataLen - Pointer to the length of the output buffer
Return Value:
WN_SUCCESS if successful, otherwise the appropriate error
Notes:
--*/
{
HANDLE DeviceHandle; // The mini rdr device handle
ULONG BytesRet;
BOOL rc;
ULONG Status;
Status = WN_SUCCESS;
// Grab a handle to the redirector device object
DeviceHandle = CreateFile(
DD_NULMRX_USERMODE_DEV_NAME_U,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_EXISTING,
0,
(HANDLE) NULL );
if ( INVALID_HANDLE_VALUE != DeviceHandle )
{
rc = DeviceIoControl(
DeviceHandle,
IoctlCode,
InputDataBuf,
InputDataLen,
OutputDataBuf,
*pOutputDataLen,
pOutputDataLen,
NULL );
if ( !rc )
{
DbgP(( L"SendToMiniRdr: returning error from DeviceIoctl\n" ));
Status = GetLastError( );
}
else
{
DbgP(( L"SendToMiniRdr: The DeviceIoctl call succeded\n" ));
}
CloseHandle(DeviceHandle);
}
else
{
Status = GetLastError( );
DbgP(( L"SendToMiniRdr: error %lx opening device \n", Status ));
}
return Status;
}
DWORD APIENTRY
NPAddConnection(
LPNETRESOURCE lpNetResource,
LPWSTR lpPassword,
LPWSTR lpUserName )
/*++
Routine Description:
This routine adds a connection to the list of connections associated
with this network provider
Arguments:
lpNetResource - the NETRESOURCE struct
lpPassword - the password
lpUserName - the user name
Return Value:
WN_SUCCESS if successful, otherwise the appropriate error
Notes:
--*/
{
DbgP(( L"NPAddConnection....\n" ));
return NPAddConnection3( NULL, lpNetResource, lpPassword, lpUserName, 0 );
}
DWORD APIENTRY
NPAddConnection3(
HWND hwndOwner,
LPNETRESOURCE lpNetResource,
LPWSTR lpPassword,
LPWSTR lpUserName,
DWORD dwFlags )
/*++
Routine Description:
This routine adds a connection to the list of connections associated
with this network provider
Arguments:
hwndOwner - the owner handle
lpNetResource - the NETRESOURCE struct
lpPassword - the password
lpUserName - the user name
dwFlags - flags for the connection
Return Value:
WN_SUCCESS if successful, otherwise the appropriate error
--*/
{
DWORD Status;
WCHAR ConnectionName[128];
WCHAR wszScratch[128];
WCHAR LocalName[3];
DWORD CopyBytes = 0;
DbgP(( L"NPAddConnection3....\n" ));
DbgP(( L"Local Name: %s\n", lpNetResource->lpLocalName ));
DbgP(( L"Remote Name: %s\n", lpNetResource->lpRemoteName ));
Status = WN_SUCCESS;
// \device\miniredirector\;<DriveLetter>:\Server\Share
if ( lstrlen( lpNetResource->lpLocalName ) > 1 )
{
if ( lpNetResource->lpLocalName[1] == L':' )
{
// LocalName[0] = (WCHAR) CharUpper( (PWCHAR) MAKELONG( (USHORT) lpNetResource->lpLocalName[0], 0 ) );
LocalName[0] = (WCHAR) toupper(lpNetResource->lpLocalName[0]);
LocalName[1] = L':';
LocalName[2] = L'\0';
lstrcpyn( ConnectionName, DD_NULMRX_FS_DEVICE_NAME_U, 126 );
wcsncat(ConnectionName, L"\\;", 3 );
wcsncat(ConnectionName, LocalName, 128-wcslen(ConnectionName));
}
else
{
Status = WN_BAD_LOCALNAME;
}
}
else
{
Status = WN_BAD_LOCALNAME;
}
if (Status == WN_SUCCESS)
{
if(lpNetResource->lpRemoteName[0] == L'\0')
{
Status = WN_BAD_NETNAME;
}
// format proper server name
else if ( lpNetResource->lpRemoteName[0] == L'\\' && lpNetResource->lpRemoteName[1] == L'\\' )
{
wcsncat( ConnectionName, lpNetResource->lpRemoteName + 1 , 128-wcslen(ConnectionName));
DbgP(( L"Full Connect Name: %s\n", ConnectionName ));
DbgP(( L"Full Connect Name Length: %d\n", ( wcslen( ConnectionName ) + 1 ) * sizeof( WCHAR ) ));
}
else
{
Status = WN_BAD_NETNAME;
}
}
if ( Status == WN_SUCCESS )
{
if ( QueryDosDevice( LocalName, wszScratch, 128 ) )
{
Status = WN_ALREADY_CONNECTED;
}
else if ( GetLastError( ) == ERROR_FILE_NOT_FOUND )
{
HANDLE hFile;
Status = SendToMiniRdr( IOCTL_NULMRX_ADDCONN, ConnectionName,
( lstrlen( ConnectionName ) + 1 ) * sizeof( WCHAR ),
NULL, &CopyBytes );
if ( Status == WN_SUCCESS )
{
if ( !DefineDosDevice( DDD_RAW_TARGET_PATH |
DDD_NO_BROADCAST_SYSTEM,
lpNetResource->lpLocalName,
ConnectionName ) )
{
Status = GetLastError( );
}
}
else
{
Status = WN_BAD_NETNAME;
}
}
else
{
Status = WN_ALREADY_CONNECTED;
}
}
return Status;
}
DWORD APIENTRY
NPCancelConnection(
LPWSTR lpName,
BOOL fForce )
/*++
Routine Description:
This routine cancels ( deletes ) a connection from the list of connections
associated with this network provider
Arguments:
lpName - name of the connection
fForce - forcefully delete the connection
Return Value:
WN_SUCCESS if successful, otherwise the appropriate error
Notes:
--*/
{
WCHAR LocalName[3];
WCHAR RemoteName[128];
WCHAR ConnectionName[128];
ULONG CopyBytes;
DWORD DisconnectResult;
DWORD Status = WN_NOT_CONNECTED;
if(lpName == NULL)
return Status;
if ( lstrlen( lpName ) > 1 )
{
if ( lpName[1] == L':' )
{
// LocalName[0] = (WCHAR) CharUpper( (PWCHAR) MAKELONG( (USHORT) lpName[0], 0 ) );
LocalName[0] = (WCHAR) toupper(lpName[0]);
LocalName[1] = L':';
LocalName[2] = L'\0';
CopyBytes = 128 * sizeof(WCHAR);
Status = SendToMiniRdr( IOCTL_NULMRX_GETCONN, LocalName, 3 * sizeof( WCHAR ),
(PVOID) RemoteName, &CopyBytes );
if ( Status == WN_SUCCESS && CopyBytes > 0 && CopyBytes < 128 * sizeof(WCHAR) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -