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

📄 test.c

📁 一个普通的mount工具,能过CIFS协议来挂载盘符
💻 C
字号:
#ifndef WINNT

#include <portable.h>
#include <__trace.h>
#include <stdio.h>

HANDLE OpenLocalFile( PCSTR szFile )
{
	return CreateFile( szFile, 
		GENERIC_READ, 0, NULL, 
		OPEN_EXISTING, 
		FILE_ATTRIBUTE_NORMAL, 
		NULL );
}

void CloseLocalFile( HANDLE hFile )
{
	CloseHandle( hFile );
}

BOOL
ReadLocalFile(
    HANDLE hFile,
	LONG lPos,
    PVOID lpBuffer,
    DWORD nNumberOfBytesToRead,
    LPDWORD lpNumberOfBytesRead
    )
{
	if( SetFilePointer( hFile, lPos, NULL, FILE_BEGIN ) == INVALID_FILE_SIZE )
	{
		return FALSE;
	}

	return ReadFile( hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, NULL );
}

#else

#define	WIN_KERNEL_MODE
#include <ntddk.h>
#include <KWin32.h>

#define malloc(n)	ExAllocatePool(NonPagedPool, n)
#define free(p)	ExFreePool(p)

HANDLE OpenLocalFile( PCSTR szFile )
{
	NTSTATUS Status;
	ANSI_STRING FileName;
	UNICODE_STRING FileNameUniStr;
    OBJECT_ATTRIBUTES stObjectAttributes;
	IO_STATUS_BLOCK stIoStatus;
	HANDLE hFile;

	RtlInitAnsiString( &FileName, szFile );
	RtlAnsiStringToUnicodeString( &FileNameUniStr, &FileName, TRUE );

    InitializeObjectAttributes( &stObjectAttributes,
								&FileNameUniStr,
								OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,
								NULL,
								NULL );

    Status = ZwCreateFile( 
        &hFile, 
        GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE, 
        &stObjectAttributes,
        &stIoStatus,
        NULL,   //  AllocationSize
        FILE_ATTRIBUTE_NORMAL,
        0,
        FILE_OPEN,
        FILE_SYNCHRONOUS_IO_NONALERT,  //  CreateOptions
        NULL, 0  //  EaBuffer, EaBufferLength
        );

	ExFreePool( FileNameUniStr.Buffer );

	if( NT_SUCCESS(Status) )
	{
		return hFile;
	}

	return INVALID_HANDLE_VALUE;
}

void CloseLocalFile( HANDLE hFile )
{
	ZwClose( hFile );
}

BOOL
ReadLocalFile(
    HANDLE hFile,
	LONG lPos,
    PVOID lpBuffer,
    DWORD nNumberOfBytesToRead,
    DWORD * lpNumberOfBytesRead
    )
{
	NTSTATUS Status;
	IO_STATUS_BLOCK stIoStatus;
	LARGE_INTEGER u64Offset;

	u64Offset.QuadPart = lPos;

    Status = ZwReadFile( 
        hFile,
        NULL, //  Event
        NULL, //  ApcRoutine
        NULL, //  ApcContext
        &stIoStatus,
        lpBuffer, 
        nNumberOfBytesToRead,
        &u64Offset, //  ByteOffset
        0 );  //  Key

	if( NT_SUCCESS(Status) )
	{
		return TRUE;
	}

	return FALSE;
}

#endif

#include "nfs.h"

int TestClient(PCSTR szIpAddress, PCSTR szRemoteFile, PCSTR szLocalFile)
{
	NFS_FILEHANDLE hRemoteFile;
	HANDLE hLocalFile;
	LONGLONG llPos;
    DWORDLONG u64Size;
	int nCompareUnitSize = 0x10000;
	PBYTE pBuffer1;
	PBYTE pBuffer2;

    printf( "Connecting the server, please waiting...\n" );

    hRemoteFile = NFS_OpenFile( szIpAddress, szRemoteFile, GENERIC_READ );
	if( hRemoteFile == (NFS_FILEHANDLE)INVALID_HANDLE_VALUE )
	{
		return -1;
	}

    if( !NFS_GetFileSize( hRemoteFile, &u64Size ) )
    {
		NFS_CloseFile( hRemoteFile );
        return -1;
    }

	hLocalFile = OpenLocalFile( szLocalFile );

	if( hLocalFile == INVALID_HANDLE_VALUE )
	{
		NFS_CloseFile( hRemoteFile );
		return -1;
	}

	pBuffer1 = malloc(nCompareUnitSize);
	if( pBuffer1 == NULL )
	{
		NFS_CloseFile( hRemoteFile );
		return -1;
	}

	pBuffer2 = malloc(nCompareUnitSize);
	if( pBuffer2 == NULL )
	{
		free( pBuffer1 );
		NFS_CloseFile( hRemoteFile );
		return -1;
	}

	for( llPos = 0; llPos < (LONGLONG)u64Size; )
	{
		DWORD dwRead;
		UINT i;
		UINT nToRead;

		if( u64Size - llPos > nCompareUnitSize )
		{
			nToRead = nCompareUnitSize;
		}
		else
		{
			nToRead = (int)(u64Size - llPos);
		}

		if( !NFS_SeekFile( hRemoteFile, llPos ) )
		{
			break;
		}

		if( NFS_ReadFile( hRemoteFile, pBuffer1, nToRead ) != nToRead )
		{
			break;
		}

		if( !ReadLocalFile( hLocalFile, (LONG)llPos, pBuffer2, nToRead, &dwRead ) )
		{
			break;
		}

		for( i = 0; i < nToRead; i ++ )
		{
			if( pBuffer1[i] != pBuffer2[i] )
			{
				break;
			}
		}

		llPos += nToRead;
	}

	free( pBuffer2 );
	free( pBuffer1 );

	NFS_CloseFile( hRemoteFile );
	CloseLocalFile( hLocalFile );

	if( llPos == (LONGLONG)u64Size )
	{
		return 0;
	}

    return -1;
}

⌨️ 快捷键说明

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