⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nfs.cpp

📁 一个普通的mount工具,能过CIFS协议来挂载盘符
💻 CPP
字号:
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <winioctl.h>
#include "nfs.h"
#include "../ioctl.h"

UINT GetIpAddressOfLocalHost(void)
{
    char szLocalHostName[MAX_PATH];
    
    if( gethostname(szLocalHostName, MAX_PATH) == SOCKET_ERROR )
    {
        return 0;
    }
    
    struct hostent *pHost = gethostbyname( szLocalHostName );
    if( pHost == NULL ||
        pHost->h_addr_list == NULL || pHost->h_addr_list[0] == NULL )
    {
        return 0;
    }
    
	struct in_addr addr = *(struct in_addr*)pHost->h_addr_list[0];
    return addr.s_addr;
}

PCSTR GetIpAddressNameOfLocalHost(void)
{
    struct in_addr stAddr;

    stAddr.S_un.S_addr = GetIpAddressOfLocalHost();
    return inet_ntoa( stAddr );
}

DWORD WINAPI FileSysThread(LPVOID)
{
    ClNFSFileSysAgent theServer( GetIpAddressNameOfLocalHost() );

    return theServer.Do();
}

DWORD WINAPI FileAgentThread(LPVOID)
{
    ClNFSFileAgent theServer( GetIpAddressNameOfLocalHost() );

    return theServer.Do();
}

extern "C" int TestClient(PCSTR szIpAddress, PCSTR szRemoteFile, PCSTR szLocalFile);

BOOL TestKernelClient(PCSTR szIpAddress, PCSTR szRemoteFile, PCSTR szLocalFile)
{
    CHAR szKernelFileName[MAX_PATH];

	if( strlen(szLocalFile) >= 2 && 
		szLocalFile[0] != '\\' &&
		szLocalFile[1] != ':' )
	{
		char aryCurrentDir[MAX_PATH];

		//	The path is a relative path
		GetCurrentDirectory( MAX_PATH, aryCurrentDir );
		wsprintf( szKernelFileName, "\\??\\%s\\%s", aryCurrentDir, szLocalFile );
	}
	else
	{
		//	The path is an absolute path
		wsprintf( szKernelFileName, "\\??\\%s", szLocalFile );
	}

	HANDLE hDevice = CreateFile(
			  "\\\\.\\NetDisk",
			  GENERIC_READ|GENERIC_WRITE,
			  FILE_SHARE_READ,
			  0,
			  OPEN_EXISTING,
			  0,
			  NULL);

	if (hDevice != INVALID_HANDLE_VALUE)
	{
		St_TestCmd stCmd;
		BOOL isDone;
		DWORD dwBytesReturned;

		strcpy( stCmd.szIpAddress, szIpAddress );
		strcpy( stCmd.szRemotePath, szRemoteFile );
		strcpy( stCmd.szLocalPath, szKernelFileName );

        isDone = DeviceIoControl( hDevice,
                   IOCTL_TEST,
                   &stCmd, sizeof(stCmd),
                   NULL, 0,
                   &dwBytesReturned, NULL);
        
		CloseHandle(hDevice);

        return isDone;
	}   

    return FALSE;
}

static void ShowUsage(void)
{
	printf( 
		"Usage:\n"
		"NfpServer server|[test|ktest ip_address remote_file_path local_file_path]\n" );
}

int main(int argc, char ** argv)
{
    if( argc < 2 )
	{
		ShowUsage();
		return -1;
	}

	if( strcmp( argv[1], "test" ) == 0 )
	{
		if( argc != 5 )
		{
			ShowUsage();
			return -1;
		}

		ClWinSocketApplication SocketApp;
		ClNfsClientApplication NfsApp;

		if( TestClient( argv[2], argv[3], argv[4] ) == 0 )
		{
			printf( "Match.\n" );
			return 0;
		}
		else
		{
			printf( "Fail!\n" );
		}

		return -1;
	}

	if( strcmp( argv[1], "ktest" ) == 0 )
	{
		if( argc != 5 )
		{
			ShowUsage();
			return -1;
		}

		if( TestKernelClient( argv[2], argv[3], argv[4] ) == 0 )
		{
			printf( "Match.\n" );
			return 0;
		}
		else
		{
			printf( "Fail!\n" );
		}

		return -1;
	}

	if( strcmp( argv[1], "server" ) == 0 )
	{
		ClWinSocketApplication SocketApp;
    
		printf( "Now the server is listening...\n" );
		DWORD dwThread;
		::CreateThread( NULL, 0, FileSysThread, 0, 0, &dwThread );
		return (int)FileAgentThread(0);
	}

	ShowUsage();

	return -1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -