windows-nt/Source/XPSP1/NT/base/ntdll/tpath.c
2020-09-26 16:20:57 +08:00

555 lines
14 KiB
C

/*++
Copyright (b\\c) 2000 Microsoft Corporation
Module Name:
tpath.b\\c
Abstract:
Test program for path stuff in rtl.
Author:
Jay Krell (a-JayK) November 2000
Revision History:
--*/
#include "nt.h"
#include "ntrtl.h"
#include "nturtl.h"
#include "windows.h"
#include <stdio.h>
//__declspec(selectany) int _ldused = 0;
//__declspec(selectany) int _fltused = 0;
#if 1
void __stdcall RtlpInitDeferedCriticalSection(void);
void __stdcall RtlpDphInitializeDelayedFreeQueue(void);
extern RTL_CRITICAL_SECTION RtlpDphHeapListCriticalSection;
VOID __stdcall LdrpInitialize (IN PCONTEXT Context, IN PVOID SystemArgument1, IN PVOID SystemArgument2);
void NtdllMain()
{
PPEB PPeb = NtCurrentPeb();
PTEB PTeb = NtCurrentTeb();
PEB Peb;
TEB Teb;
HANDLE NtdllModuleHandle = GetModuleHandleW(L"ntdll.dll");
HANDLE MyModuleHandle = GetModuleHandleW(NULL);
PIMAGE_NT_HEADERS MyHeaders = RtlImageNtHeader(MyModuleHandle);
/*const*/ static IMAGE_NT_HEADERS ZeroHeaders = { 0 };
SIZE_T RegionSize = 0x10000;
PVOID Base = MyModuleHandle;
ULONG OldProtect = 0;
NTSTATUS Status;
Status = NtProtectVirtualMemory(
NtCurrentProcess(),
&Base,
&RegionSize,
PAGE_EXECUTE_READWRITE,
&OldProtect
);
/*
WriteProcessMemory(
NtCurrentProcess(),
&MyHeaders->OptionalHeader.DataDirectory,
&ZeroHeaders,
sizeof(MyHeaders->OptionalHeader.DataDirectory),
NULL
);
*/
RtlZeroMemory(&MyHeaders->OptionalHeader.DataDirectory, sizeof(MyHeaders->OptionalHeader.DataDirectory));
#if 0
NLSTABLEINFO InitTableInfo = {0};
RtlInitNlsTables(
Peb->AnsiCodePageData,
Peb->OemCodePageData,
Peb->UnicodeCaseTableData,
&InitTableInfo
);
RtlResetRtlTranslations(&InitTableInfo);
RtlpInitDeferedCriticalSection();
RtlInitializeCriticalSection( &RtlpDphHeapListCriticalSection );
RtlpDphInitializeDelayedFreeQueue();
#elif 1
Peb = *PPeb;
Teb = *PTeb;
RtlZeroMemory(NtCurrentPeb(), sizeof(*NtCurrentPeb()));
PPeb->ProcessParameters = Peb.ProcessParameters;
PPeb->BeingDebugged = Peb.BeingDebugged;
PPeb->FastPebLock = Peb.FastPebLock;
PPeb->FastPebLockRoutine = Peb.FastPebLockRoutine;
PPeb->FastPebUnlockRoutine = Peb.FastPebUnlockRoutine;
PPeb->ProcessHeap = Peb.ProcessHeap;
PPeb->ImageBaseAddress = Peb.ImageBaseAddress;
PPeb->AnsiCodePageData = Peb.AnsiCodePageData;
PPeb->OemCodePageData = Peb.OemCodePageData;
PPeb->UnicodeCaseTableData = Peb.UnicodeCaseTableData;
PPeb->NtGlobalFlag = Peb.NtGlobalFlag
/*
| FLG_HEAP_ENABLE_TAIL_CHECK |
FLG_HEAP_ENABLE_FREE_CHECK |
FLG_HEAP_VALIDATE_PARAMETERS |
FLG_HEAP_VALIDATE_ALL |
FLG_HEAP_ENABLE_TAGGING
*/
;
__try
{
//LdrpInitialize(0, NtdllModuleHandle, 0);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
PPeb->ProcessParameters = Peb.ProcessParameters;
PPeb->BeingDebugged = Peb.BeingDebugged;
PPeb->NtGlobalFlag = Peb.NtGlobalFlag
/*
| FLG_HEAP_ENABLE_TAIL_CHECK |
FLG_HEAP_ENABLE_FREE_CHECK |
FLG_HEAP_VALIDATE_PARAMETERS |
FLG_HEAP_VALIDATE_ALL |
FLG_HEAP_ENABLE_TAGGING
*/
;
PPeb->FastPebLock = Peb.FastPebLock;
PPeb->FastPebLockRoutine = Peb.FastPebLockRoutine;
PPeb->ProcessHeap = Peb.ProcessHeap;
PPeb->FastPebUnlockRoutine = Peb.FastPebUnlockRoutine;
PPeb->ImageBaseAddress = Peb.ImageBaseAddress;
PPeb->AnsiCodePageData = Peb.AnsiCodePageData;
PPeb->OemCodePageData = Peb.OemCodePageData;
PPeb->UnicodeCaseTableData = Peb.UnicodeCaseTableData;
PPeb->Ldr = Peb.Ldr;
#else
#endif
}
#else
void NtdllMain() { }
#include "curdir.c"
#endif
// WriteProcessMemory(1 + (ULONG_PTR)RtlEnterCriticalSection, GetModuleHandleW(L"ntdll.dll"), "RtlEnterCriticalSection"
static BOOLEAN InMain;
int __cdecl main(int argc, char** argv)
{
UCHAR Buffer[100];
RTL_UNICODE_STRING_BUFFER StringBuffer = {0};
UNICODE_STRING String = {0};
ULONG i = 0;
PCWSTR x = 0;
PCWSTR y = 0;
NTSTATUS Status = 0;
const static WCHAR AppendPathElementTestData[] =
{
// noslash
L"a\0bar\0" // = a\b
// one slash
L"/a\0bar\0" // = /a/b
L"a/\0bar\0" // = /a/b/
L"a\0/b\0" // = a/b
L"a\0bar/\0" // = a/b/
// two slashes
L"/a/\0bar\0" // = /a/b/
L"/a\0/b\0" // = /a/b
L"/a\0bar/\0" // = /a/b/
L"a/\0/b\0" // = a/b/
L"a/\0bar/\0" // = a/b/
L"a\0/b/\0" // = a/b/
// three slashes
L"/a/\0/b\0" // = /a/b/
L"/a/\0bar/\0" // = /a/b/
L"/a\0/b/\0" // = /a/b/
L"a/\0/b/\0" // = a/b
// four slashes
L"/a/\0/b/\0" // = /a/b/
//
// 1 + 4 + 6 + 4 + 1 = 4^2 = 16 posibilities
L"\0"
};
const static WCHAR RemoveLastPathElementTestData[] =
{
//
// move/copy cases to the top to debug them
//
//L"c:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
//L"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
//L"\0"
L"\\\\a\\\\b\\\\c\\\\\0"
L"x:\\\0"
L"c:a\\\\b\\c\\\\\0"
L"\\\\?\\a:\\\0"
L"\\\\?\\unc\\a\\b\0"
L"\\\0"
L"\\\\\0"
L"\\\\?\0"
L"\\\\?\\unc\0"
L"\\\\?\\unc\\a\0"
L"\\\\?\\unc\\a\\b\0"
L"\\\\?\\unc\\a\\b\\c\0"
L"\\\\?\\a\0"
L"\\\\?\\a\\b\0"
L"\\\\?\\a\\b\\c\0"
L"\\\\?\\a:\0"
L"\\\\?\\a:\\\0"
L"\\\\?\\a:\\b\0"
L"\\\\?\\a:\\b\\c\0"
L"\\\\a\\\\b\\c\\\\\0"
L"\\\\a\\\\b\\c\\\0"
L"\\\\a\\\\b\\c/\0"
L"\\\\a\\\\b\\c//\0"
L"\\\\a\\\\b\\c/\\\0"
L"\\\\a\\\\b\\c\\/\0"
L"\\\\a\\\\b\\c\0"
L"\\\\a\\b\\c\\\\\0"
L"\\\\a\\b\\c\\\0"
L"\\\\a\\b\\c/\0"
L"\\\\a\\b\\c//\0"
L"\\\\a\\b\\c/\\\0"
L"\\\\a\\b\\c\\/\0"
L"\\\\a\\b\\c\0"
L"\\\\a/b\\c\\\\\0"
L"\\\\a/b\\c\\\0"
L"\\\\a/b\\c/\0"
L"\\\\a/b\\c//\0"
L"\\\\a/b\\c/\\\0"
L"\\\\a/b\\c\\/\0"
L"\\\\a/b\\c\0"
L"\\\\a//b\\c\\\\\0"
L"\\\\a//b\\c\\\0"
L"\\\\a//b\\c/\0"
L"\\\\a//b\\c//\0"
L"\\\\a//b\\c/\\\0"
L"\\\\a//b\\c\\/\0"
L"\\\\a//b\\c\0"
L"\\\\a/\\b\\c\\\\\0"
L"\\\\a/\\b\\c\\\0"
L"\\\\a/\\b\\c/\0"
L"\\\\a/\\b\\c//\0"
L"\\\\a/\\b\\c/\\\0"
L"\\\\a/\\b\\c\\/\0"
L"\\\\a/\\b\\c\0"
L"\\\\a\\/b\\c\\\\\0"
L"\\\\a\\/b\\c\\\0"
L"\\\\a\\/b\\c/\0"
L"\\\\a\\/b\\c//\0"
L"\\\\a\\/b\\c/\\\0"
L"\\\\a\\/b\\c\\/\0"
L"\\\\a\\/b\\c\0"
L"\\\\\0"
L"//\0"
L"/\\\0"
L"\\/\0"
L"x:\\\\a\\\\b\\c\\\\\0"
L"x:\\\\a\\\\b\\c\\\0"
L"x:\\\\a\\\\b\\c/\0"
L"x:\\\\a\\\\b\\c//\0"
L"x:\\\\a\\\\b\\c/\\\0"
L"x:\\\\a\\\\b\\c\\/\0"
L"x:\\\\a\\\\b\\c\0"
L"x:\\\\a\\b\\c\\\\\0"
L"x:\\\\a\\b\\c\\\0"
L"x:\\\\a\\b\\c/\0"
L"x:\\\\a\\b\\c//\0"
L"x:\\\\a\\b\\c/\\\0"
L"x:\\\\a\\b\\c\\/\0"
L"x:\\\\a\\b\\c\0"
L"x:\\\\a/b\\c\\\\\0"
L"x:\\\\a/b\\c\\\0"
L"x:\\\\a/b\\c/\0"
L"x:\\\\a/b\\c//\0"
L"x:\\\\a/b\\c/\\\0"
L"x:\\\\a/b\\c\\/\0"
L"x:\\\\a/b\\c\0"
L"x:\\\\a//b\\c\\\\\0"
L"x:\\\\a//b\\c\\\0"
L"x:\\\\a//b\\c/\0"
L"x:\\\\a//b\\c//\0"
L"x:\\\\a//b\\c/\\\0"
L"x:\\\\a//b\\c\\/\0"
L"x:\\\\a//b\\c\0"
L"x:\\\\a/\\b\\c\\\\\0"
L"x:\\\\a/\\b\\c\\\0"
L"x:\\\\a/\\b\\c/\0"
L"x:\\\\a/\\b\\c//\0"
L"x:\\\\a/\\b\\c/\\\0"
L"x:\\\\a/\\b\\c\\/\0"
L"x:\\\\a/\\b\\c\0"
L"x:\\\\a\\/b\\c\\\\\0"
L"x:\\\\a\\/b\\c\\\0"
L"x:\\\\a\\/b\\c/\0"
L"x:\\\\a\\/b\\c//\0"
L"x:\\\\a\\/b\\c/\\\0"
L"x:\\\\a\\/b\\c\\/\0"
L"x:\\\\a\\/b\\c\0"
L"x:\\\\a\\\\\0"
L"x:\\\\a\\\0"
L"x:\\\\a/\0"
L"x:\\\\a//\0"
L"x:\\\\a/\\\0"
L"x:\\\\a\\/\0"
L"x:\\\\a\0"
L"x:\\a\\\\\0"
L"x:\\a\\\0"
L"x:\\a/\0"
L"x:\\a//\0"
L"x:\\a/\\\0"
L"x:\\a\\/\0"
L"x:\\a\0"
L"x:/a\\\\\0"
L"x:/a\\\0"
L"x:/a/\0"
L"x:/a//\0"
L"x:/a/\\\0"
L"x:/a\\/\0"
L"x:/a\0"
L"x:\\\0"
L"x:/\0"
L"x:\0"
L"c\0"
//////////////////////////////////////////////////////////////////////////
L"a\\\\b\\c\\\\\0"
L"a\\\\b\\c\\\0"
L"a\\\\b\\c/\0"
L"a\\\\b\\c//\0"
L"a\\\\b\\c/\\\0"
L"a\\\\b\\c\\/\0"
L"a\\\\b\\c\0"
L"a\\b\\c\\\\\0"
L"a\\b\\c\\\0"
L"a\\b\\c/\0"
L"a\\b\\c//\0"
L"a\\b\\c/\\\0"
L"a\\b\\c\\/\0"
L"a\\b\\c\0"
L"a/b\\c\\\\\0"
L"a/b\\c\\\0"
L"a/b\\c/\0"
L"a/b\\c//\0"
L"a/b\\c/\\\0"
L"a/b\\c\\/\0"
L"a/b\\c\0"
L"a//b\\c\\\\\0"
L"a//b\\c\\\0"
L"a//b\\c/\0"
L"a//b\\c//\0"
L"a//b\\c/\\\0"
L"a//b\\c\\/\0"
L"a//b\\c\0"
L"a/\\b\\c\\\\\0"
L"a/\\b\\c\\\0"
L"a/\\b\\c/\0"
L"a/\\b\\c//\0"
L"a/\\b\\c/\\\0"
L"a/\\b\\c\\/\0"
L"a/\\b\\c\0"
L"a\\/b\\c\\\\\0"
L"a\\/b\\c\\\0"
L"a\\/b\\c/\0"
L"a\\/b\\c//\0"
L"a\\/b\\c/\\\0"
L"a\\/b\\c\\/\0"
L"a\\/b\\c\0"
L"x:a\\\\b\\c\\\\\0"
L"x:a\\\\b\\c\\\0"
L"x:a\\\\b\\c/\0"
L"x:a\\\\b\\c//\0"
L"x:a\\\\b\\c/\\\0"
L"x:a\\\\b\\c\\/\0"
L"x:a\\\\b\\c\0"
L"x:a\\b\\c\\\\\0"
L"x:a\\b\\c\\\0"
L"x:a\\b\\c/\0"
L"x:a\\b\\c//\0"
L"x:a\\b\\c/\\\0"
L"x:a\\b\\c\\/\0"
L"x:a\\b\\c\0"
L"x:a/b\\c\\\\\0"
L"x:a/b\\c\\\0"
L"x:a/b\\c/\0"
L"x:a/b\\c//\0"
L"x:a/b\\c/\\\0"
L"x:a/b\\c\\/\0"
L"x:a/b\\c\0"
L"x:a//b\\c\\\\\0"
L"x:a//b\\c\\\0"
L"x:a//b\\c/\0"
L"x:a//b\\c//\0"
L"x:a//b\\c/\\\0"
L"x:a//b\\c\\/\0"
L"x:a//b\\c\0"
L"x:a/\\b\\c\\\\\0"
L"x:a/\\b\\c\\\0"
L"x:a/\\b\\c/\0"
L"x:a/\\b\\c//\0"
L"x:a/\\b\\c/\\\0"
L"x:a/\\b\\c\\/\0"
L"x:a/\\b\\c\0"
L"x:a\\/b\\c\\\\\0"
L"x:a\\/b\\c\\\0"
L"x:a\\/b\\c/\0"
L"x:a\\/b\\c//\0"
L"x:a\\/b\\c/\\\0"
L"x:a\\/b\\c\\/\0"
L"x:a\\/b\\c\0"
L"x:a\\\\\0"
L"x:a\\\0"
L"x:a/\0"
L"x:a//\0"
L"x:a/\\\0"
L"x:a\\/\0"
L"x:a\0"
L"x:a\\\\\0"
L"x:a\\\0"
L"x:a/\0"
L"x:a//\0"
L"x:a/\\\0"
L"x:a\\/\0"
L"x:a\0"
L"x:a\\\\\0"
L"x:a\\\0"
L"x:a/\0"
L"x:a//\0"
L"x:a/\\\0"
L"x:a\\/\0"
L"x:a\0"
L"\\a\\b\\c\\\\\0"
L"\\a\\b\\c\\\0"
L"\\a\\b\\c/\0"
L"\\a\\b\\c//\0"
L"\\a\\b\\c/\\\0"
L"\\a\\b\\c\\/\0"
L"\\a\\b\\c\0"
L"\\a\0"
L"\\a\\\0"
L"\\a\\\0"
L"\\a\\\0"
L"\\a\\\0"
L"\\a\\\0"
L"\\a\\b\\c\0"
L"\0\0"
};
if (InMain)
return;
InMain = TRUE;
NtdllMain();
Status = RtlInitUnicodeStringBuffer(&StringBuffer, Buffer, sizeof(Buffer));
RTL_SOFT_ASSERT(NT_SUCCESS(Status));
#if 1
for ( (x = AppendPathElementTestData, y = x + wcslen(x) + 1) ;
*x && *y ;
(x = y + wcslen(y) + 1, y = x + wcslen(x) + 1)
)
{
RtlInitUnicodeString(&String, x);
RTL_SOFT_VERIFY(NT_SUCCESS(Status = RtlAssignUnicodeStringBuffer(&StringBuffer, &String)));
RtlInitUnicodeString(&String, y);
RTL_SOFT_VERIFY(NT_SUCCESS(Status = RtlAppendPathElement(0, &StringBuffer, &String)));
printf("%ls + %ls = %ls\n", x, y, StringBuffer.String.Buffer);
}
#endif
#if 1
printf("\n\nDosPath<->NtPath conversion\n\n");
for (x = RemoveLastPathElementTestData ; *x || *(x + 1) ; x += + wcslen(x) + 1)
{
UNICODE_STRING DosToNt = {0};
RTL_UNICODE_STRING_BUFFER NtToDos = {0};
BOOLEAN Success;
RtlInitUnicodeStringBuffer(&NtToDos, 0, 0);
//RtlInitUnicodeStringBuffer(&NtToDos, Buffer, sizeof(Buffer));
RTL_SOFT_VERIFY(Success = RtlDosPathNameToNtPathName_U(x, &DosToNt, NULL, NULL));
if (!Success)
printf("%ls failed\n", x);
else if (DosToNt.Length && DosToNt.Buffer)
{
printf("%ls -> %ls\n", x, DosToNt.Buffer);
RTL_SOFT_VERIFY(NT_SUCCESS(Status = RtlAssignUnicodeStringBuffer(&NtToDos, &DosToNt)));
RTL_SOFT_VERIFY(NT_SUCCESS(Status = RtlNtPathNameToDosPathName(0, &NtToDos, NULL, NULL)));
if (Status != STATUS_SUCCESS)
printf("%ls Status = 0x%08lx\n", x, Status);
else if (NtToDos.String.Length && NtToDos.String.Buffer)
printf("%ls -> %ls\n\n", DosToNt.Buffer, NtToDos.String.Buffer);
}
RtlFreeStringRoutine(DosToNt.Buffer);
RtlFreeUnicodeStringBuffer(&NtToDos);
}
#endif
return 0;
}