mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
246 lines
4.8 KiB
246 lines
4.8 KiB
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#define WIN32_CONSOLE_APP
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <ntddnwfs.h>
|
|
|
|
#define CANCEL
|
|
|
|
VOID
|
|
dump(
|
|
IN ULONG Level,
|
|
IN PVOID far_p,
|
|
IN ULONG len
|
|
);
|
|
|
|
VOID
|
|
HexDumpLine (
|
|
PCHAR pch,
|
|
ULONG len,
|
|
PCHAR s,
|
|
PCHAR t,
|
|
USHORT flag
|
|
);
|
|
|
|
BOOLEAN test1();
|
|
|
|
int
|
|
_cdecl
|
|
main(
|
|
int argc,
|
|
char *argv[]
|
|
)
|
|
{
|
|
UCHAR error = FALSE;
|
|
|
|
printf( "Test1...\n" );
|
|
if (!test1()) {
|
|
printf("Error: Test 1 failed\n");
|
|
error = TRUE;
|
|
}
|
|
return error;
|
|
}
|
|
|
|
|
|
|
|
BOOLEAN
|
|
test1()
|
|
{
|
|
HANDLE FileHandle;
|
|
NTSTATUS Status;
|
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
|
UNICODE_STRING UnicodeString;
|
|
IO_STATUS_BLOCK IoStatus;
|
|
|
|
CHAR Input1[] = { 0, 1, 1, 1, '\\' };
|
|
CHAR Input2[] = { 1, 1 };
|
|
CHAR Output[20];
|
|
|
|
printf( "test 1: opening\n");
|
|
|
|
RtlInitUnicodeString( &UnicodeString, L"\\Device\\NwRdr\\Netware311" );
|
|
|
|
InitializeObjectAttributes(
|
|
&ObjectAttributes,
|
|
&UnicodeString,
|
|
0,
|
|
NULL,
|
|
NULL
|
|
);
|
|
|
|
Status = NtOpenFile (
|
|
&FileHandle,
|
|
FILE_GENERIC_READ | FILE_GENERIC_WRITE | SYNCHRONIZE,
|
|
&ObjectAttributes,
|
|
&IoStatus,
|
|
FILE_SHARE_READ,
|
|
0 );
|
|
|
|
if (Status != STATUS_SUCCESS) {
|
|
printf( "test 1: NtOpenFile failed, error = %08lx\n",Status);
|
|
return FALSE;
|
|
}
|
|
|
|
if (IoStatus.Status != STATUS_SUCCESS) {
|
|
printf( "test 1: NtOpenFile failed, error = %08lx\n",IoStatus.Status);
|
|
return FALSE;
|
|
}
|
|
|
|
printf( "test 1: opened server successfully\n");
|
|
|
|
//
|
|
// Send set path
|
|
//
|
|
|
|
NtFsControlFile( FileHandle,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
&IoStatus,
|
|
FSCTL_NWR_NCP_E2H,
|
|
&Input1,
|
|
sizeof(Input1),
|
|
&Output,
|
|
sizeof(Output) );
|
|
|
|
if (Status != STATUS_SUCCESS) {
|
|
printf( "test 1: NtFsControlFile failed, error = %0x08lx\n",Status);
|
|
return FALSE;
|
|
}
|
|
|
|
printf( "test 1: Nt fs control file succeeded\n");
|
|
|
|
if ( IoStatus.Information != 0) {
|
|
dump( 0, &Output, IoStatus.Information );
|
|
} else {
|
|
printf("Received empty buffer\n");
|
|
}
|
|
|
|
//
|
|
// Send get path
|
|
//
|
|
|
|
NtFsControlFile( FileHandle,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
&IoStatus,
|
|
FSCTL_NWR_NCP_E2H,
|
|
&Input2,
|
|
sizeof(Input2),
|
|
&Output,
|
|
sizeof(Output) );
|
|
|
|
if (Status != STATUS_SUCCESS) {
|
|
printf( "test 1: NtFsControlFile failed, error = %0x08lx\n",Status);
|
|
return FALSE;
|
|
}
|
|
|
|
printf( "test 1: Nt fs control file succeeded\n");
|
|
|
|
if ( IoStatus.Information != 0) {
|
|
dump( 0, &Output, IoStatus.Information );
|
|
} else {
|
|
printf("Received empty buffer\n");
|
|
}
|
|
|
|
|
|
//
|
|
// Now close the device
|
|
//
|
|
|
|
printf("test 1: closing device\n");
|
|
|
|
Status = NtClose( FileHandle );
|
|
if (Status != STATUS_SUCCESS) {
|
|
printf( "test 1: Wrong return value %lX - close \n",Status);
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
VOID
|
|
dump(
|
|
IN ULONG Level,
|
|
IN PVOID far_p,
|
|
IN ULONG len
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Dump Min(len, MaxDump) bytes in classic hex dump style if debug
|
|
output is turned on for this level.
|
|
|
|
Arguments:
|
|
|
|
IN Level - 0 if always display. Otherwise only display if a
|
|
corresponding bit is set in NwDebug.
|
|
|
|
IN far_p - address of buffer to start dumping from.
|
|
|
|
IN len - length in bytes of buffer.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
ULONG l;
|
|
char s[80], t[80];
|
|
PCHAR far_pchar = (PCHAR)far_p;
|
|
ULONG MaxDump = 256;
|
|
|
|
if (Level == 0) {
|
|
if (len > MaxDump)
|
|
len = MaxDump;
|
|
|
|
while (len) {
|
|
l = len < 16 ? len : 16;
|
|
|
|
printf("\n%lx ", far_pchar);
|
|
HexDumpLine (far_pchar, l, s, t, 0);
|
|
printf("%s%.*s%s", s, 1 + ((16 - l) * 3), "", t);
|
|
|
|
len -= l;
|
|
far_pchar += l;
|
|
}
|
|
printf("\n");
|
|
}
|
|
}
|
|
|
|
VOID
|
|
HexDumpLine (
|
|
PCHAR pch,
|
|
ULONG len,
|
|
PCHAR s,
|
|
PCHAR t,
|
|
USHORT flag
|
|
)
|
|
{
|
|
static UCHAR rghex[] = "0123456789ABCDEF";
|
|
|
|
UCHAR c;
|
|
UCHAR *hex, *asc;
|
|
|
|
|
|
hex = s;
|
|
asc = t;
|
|
|
|
*(asc++) = '*';
|
|
while (len--) {
|
|
c = *(pch++);
|
|
*(hex++) = rghex [c >> 4] ;
|
|
*(hex++) = rghex [c & 0x0F];
|
|
*(hex++) = ' ';
|
|
*(asc++) = (c < ' ' || c > '~') ? (CHAR )'.' : c;
|
|
}
|
|
*(asc++) = '*';
|
|
*asc = 0;
|
|
*hex = 0;
|
|
|
|
flag;
|
|
}
|
|
|