📄 nfs.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 + -