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