#include #include #include #define WIN32_CONSOLE_APP #include #include #include #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; }