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

668 lines
24 KiB
C

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
uob.c
Abstract:
Object Manager User Mode Test Program
Author:
Steve Wood (stevewo) 03-Aug-1989
Environment:
User Mode
Revision History:
--*/
#include <nt.h>
#include <ntrtl.h>
#include <string.h>
STRING DirTypeName;
STRING LinkTypeName;
VOID
TestParent( VOID );
VOID
TestChild( VOID );
VOID
DumpObjectDirs(
IN PCH DirName,
IN ULONG Level
)
{
OBJECT_ATTRIBUTES ObjectAttributes;
STRING Name;
HANDLE Handle;
ULONG Context, Length;
NTSTATUS Status;
BOOLEAN RestartScan;
POBJECT_DIRECTORY_INFORMATION DirInfo;
CHAR DirInfoBuffer[ 256 ];
CHAR SubDirName[ 128 ];
STRING LinkName;
STRING LinkTarget;
HANDLE LinkHandle;
RtlInitString( &Name, DirName );
InitializeObjectAttributes( &ObjectAttributes,
&Name,
OBJ_OPENIF | OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
NtCreateDirectoryObject( &Handle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
DirInfo = (POBJECT_DIRECTORY_INFORMATION)&DirInfoBuffer;
RestartScan = TRUE;
while (TRUE) {
Status = NtQueryDirectoryObject( Handle,
(PVOID)DirInfo,
sizeof( DirInfoBuffer ),
TRUE,
RestartScan,
&Context,
&Length
);
if (!NT_SUCCESS( Status )) {
break;
}
DbgPrint( "%s%s%Z - %Z",
DirName,
Level ? "\\" : "",
&DirInfo->Name,
&DirInfo->TypeName
);
if (RtlEqualString( &DirInfo->TypeName, &DirTypeName, TRUE )) {
DbgPrint( "\n" );
strcpy( SubDirName, DirName );
if (Level) {
strcat( SubDirName, "\\" );
}
strcat( SubDirName, DirInfo->Name.Buffer );
DumpObjectDirs( SubDirName, Level+1 );
}
else
if (RtlEqualString( &DirInfo->TypeName, &LinkTypeName, TRUE )) {
strcpy( SubDirName, DirName );
if (Level) {
strcat( SubDirName, "\\" );
}
strcat( SubDirName, DirInfo->Name.Buffer );
RtlInitString( &LinkName, SubDirName );
InitializeObjectAttributes( &ObjectAttributes,
&LinkName,
0,
NULL,
NULL
);
Status = NtOpenSymbolicLinkObject( &LinkHandle,
SYMBOLIC_LINK_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( " - unable to open symbolic link (%X)\n", Status );
}
else {
LinkTarget.MaximumLength = sizeof( SubDirName );
LinkTarget.Length = 0;
LinkTarget.Buffer = SubDirName;
Status = NtQuerySymbolicLinkObject( LinkHandle,
&LinkTarget
);
if (!NT_SUCCESS( Status )) {
DbgPrint( " - unable to query symbolic link target (%X)\n", Status );
}
else {
DbgPrint( " => %Z\n", &LinkTarget );
}
NtClose( LinkHandle );
}
}
else {
DbgPrint( "\n" );
}
RestartScan = FALSE;
}
NtClose( Handle );
}
char ParameterBuffer[ 4096 ];
main(
int argc,
char **argv,
char **envp,
int DebugFlag
)
{
NTSTATUS Status;
STRING ImageName;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
RTL_USER_PROCESS_INFORMATION ProcessInformation;
if (argc == 1) {
TestParent();
Parameters[ RTL_USER_PROC_PARAMS_IMAGEFILE ] = argv[ 0 ];
Parameters[ RTL_USER_PROC_PARAMS_CMDLINE ] = " CHILD";
Parameters[ RTL_USER_PROC_PARAMS_DEBUGFLAG ] =
DebugFlag ? "1" : "0";
Parameters[ RTL_USER_PROC_PARAMS_DEBUGFLAG+1 ] = NULL;
Arguments[ 0 ] = argv[ 0 ];
Arguments[ 1 ] = "CHILD";
Arguments[ 2 ] = NULL;
ProcessParameters = (PRTL_USER_PROCESS_PARAMETERS)ParameterBuffer;
ProcessParameters->Length = 0;
ProcessParameters->MaximumLength = sizeof( ParameterBuffer );
Status = RtlVectorsToProcessParameters( Arguments,
envp,
Parameters,
ProcessParameters
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "RtlVectorToProcessParameters failed - Status = %X\n",
Status
);
}
else {
RtlInitString( &ImageName, "\\C:\\TMP\\UOB.EXE" );
Status = RtlCreateUserProcess( &ImageName,
NULL,
NULL,
NULL,
TRUE,
NULL,
NULL,
ProcessParameters,
&ProcessInformation,
NULL
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "RtlCreateUserProcess( %Z ) failed - Status = %X\n",
&ImageName, Status
);
}
else {
Status = NtResumeThread( ProcessInformation.Thread, NULL );
Status = NtWaitForSingleObject( ProcessInformation.Process,
FALSE,
(PLARGE_INTEGER)NULL
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "NtWaitForSingleObject failed - Status = %X\n",
Status
);
}
}
}
}
else {
TestChild();
}
NtTerminateProcess( NtCurrentProcess(), Status );
}
VOID
TestParent( VOID )
{
NTSTATUS Status;
STRING DirectoryName;
STRING LinkName;
STRING LinkTarget;
STRING SectionName;
OBJECT_ATTRIBUTES ObjectAttributes;
HANDLE DirectoryHandle, LinkHandle, SectionHandle;
ULONG ReturnedLength;
CHAR ObjectInfoBuffer[ 512 ];
OBJECT_BASIC_INFORMATION ObjectBasicInfo;
POBJECT_NAME_INFORMATION ObjectNameInfo;
POBJECT_TYPE_INFORMATION ObjectTypeInfo;
LARGE_INTEGER SectionSize;
Status = STATUS_SUCCESS;
DbgPrint( "Entering Object Manager User Mode Test Program\n" );
RtlInitString( &SectionName, "\\A:\\OSO001.MSG" );
InitializeObjectAttributes( &ObjectAttributes,
&SectionName,
OBJ_OPENIF | OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
SectionSize.LowPart = 0x1000;
SectiinSize.HighPart = 0;
Status = NtCreateSection( &SectionHandle,
GENERIC_READ,
&ObjectAttributes,
&SectionSize,
PAGE_READONLY,
SEC_RESERVE,
NULL
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to create %Z section object (%X) [OK]\n", &SectionName, Status );
}
RtlInitString( &DirectoryName, "\\Drives" );
InitializeObjectAttributes( &ObjectAttributes,
&DirectoryName,
OBJ_CASE_INSENSITIVE | OBJ_PERMANENT,
NULL,
(PSECURITY_DESCRIPTOR)1
);
ObjectAttributes.Length = 0;
Status = NtCreateDirectoryObject( &DirectoryHandle,
-1,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to create %Z directory object (%X) [OK]\n",
&DirectoryName, Status );
}
RtlInitString( &DirectoryName, "\\Drives" );
InitializeObjectAttributes( &ObjectAttributes,
&DirectoryName,
OBJ_CASE_INSENSITIVE | OBJ_PERMANENT,
NULL,
(PSECURITY_DESCRIPTOR)1
);
ObjectAttributes.Length = 0;
Status = NtCreateDirectoryObject( &DirectoryHandle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to create %Z directory object (%X) [OK]\n",
&DirectoryName, Status );
}
InitializeObjectAttributes( &ObjectAttributes,
&DirectoryName,
-1,
NULL,
(PSECURITY_DESCRIPTOR)1
);
Status = NtCreateDirectoryObject( &DirectoryHandle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to create %Z directory object (%X) [OK]\n",
&DirectoryName, Status );
}
InitializeObjectAttributes( &ObjectAttributes,
&DirectoryName,
OBJ_CASE_INSENSITIVE | OBJ_PERMANENT,
NULL,
(PSECURITY_DESCRIPTOR)1
);
Status = NtCreateDirectoryObject( &DirectoryHandle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to create %Z directory object (%X) [OK]\n",
&DirectoryName, Status );
}
InitializeObjectAttributes( &ObjectAttributes,
&DirectoryName,
OBJ_CASE_INSENSITIVE | OBJ_PERMANENT,
NULL,
NULL
);
Status = NtCreateDirectoryObject( &DirectoryHandle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to create %Z directory object (%X)\n",
&DirectoryName, Status );
NtTerminateProcess( NtCurrentProcess(), Status );
}
Status = NtClose( DirectoryHandle );
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to close %Z directory object handle - %lx (%X)\n",
&DirectoryName,
DirectoryHandle,
Status
);
NtTerminateProcess( NtCurrentProcess(), Status );
}
InitializeObjectAttributes( &ObjectAttributes,
&DirectoryName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
Status = NtOpenDirectoryObject( &DirectoryHandle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to open %Z directory object (%X)\n",
&DirectoryName, Status );
NtTerminateProcess( NtCurrentProcess(), Status );
}
Status = NtQueryObject( DirectoryHandle,
ObjectBasicInformation,
&ObjectBasicInfo,
sizeof( ObjectBasicInfo ),
&ReturnedLength
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "NtQueryObject( %lx, ObjectBasicInfo ) failed - Status == %X\n",
DirectoryHandle,
Status
);
NtTerminateProcess( NtCurrentProcess(), Status );
}
DbgPrint( "NtQueryObject( %lx, ObjectBasicInfo ) returned %lx bytes\n",
DirectoryHandle,
ReturnedLength
);
DbgPrint( " Attributes = %lx\n", ObjectBasicInfo.Attributes );
DbgPrint( " GrantedAccess = %lx\n", ObjectBasicInfo.GrantedAccess );
DbgPrint( " HandleCount = %lx\n", ObjectBasicInfo.HandleCount );
DbgPrint( " PointerCount = %lx\n", ObjectBasicInfo.PointerCount );
DbgPrint( " PagedPoolCharge = %lx\n", ObjectBasicInfo.PagedPoolCharge );
DbgPrint( " NonPagedPoolCharge = %lx\n", ObjectBasicInfo.NonPagedPoolCharge );
DbgPrint( " NameInfoSize = %lx\n", ObjectBasicInfo.NameInfoSize );
DbgPrint( " TypeInfoSize = %lx\n", ObjectBasicInfo.TypeInfoSize );
DbgPrint( " SecurityDescriptorSize = %lx\n", ObjectBasicInfo.SecurityDescriptorSize );
ObjectNameInfo = (POBJECT_NAME_INFORMATION)ObjectInfoBuffer;
Status = NtQueryObject( DirectoryHandle,
ObjectNameInformation,
ObjectNameInfo,
sizeof( ObjectInfoBuffer ),
&ReturnedLength
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "NtQueryObject( %lx, ObjectNameInfo ) failed - Status == %X\n",
DirectoryHandle,
Status
);
NtTerminateProcess( NtCurrentProcess(), Status );
}
DbgPrint( "NtQueryObject( %lx, ObjectNameInfo ) returned %lx bytes\n",
DirectoryHandle,
ReturnedLength
);
DbgPrint( " Name = (%ld,%ld) '%Z'\n",
ObjectNameInfo->Name.MaximumLength,
ObjectNameInfo->Name.Length,
&ObjectNameInfo->Name
);
ObjectTypeInfo = (POBJECT_TYPE_INFORMATION)ObjectInfoBuffer;
Status = NtQueryObject( DirectoryHandle,
ObjectTypeInformation,
ObjectTypeInfo,
sizeof( ObjectInfoBuffer ),
&ReturnedLength
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "NtQueryObject( %lx, ObjectTypeInfo ) failed - Status == %X\n",
DirectoryHandle,
Status
);
NtTerminateProcess( NtCurrentProcess(), Status );
}
DbgPrint( "NtQueryObject( %lx, ObjectTypeInfo ) returned %lx bytes\n",
DirectoryHandle,
ReturnedLength
);
DbgPrint( " TypeName = (%ld,%ld) '%Z'\n",
ObjectTypeInfo->TypeName.MaximumLength,
ObjectTypeInfo->TypeName.Length,
&ObjectTypeInfo->TypeName
);
RtlInitString( &LinkName, "TestSymbolicLink" );
InitializeObjectAttributes( &ObjectAttributes,
&LinkName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
ObjectAttributes.RootDirectory = DirectoryHandle;
RtlInitString( &LinkTarget, "\\Device\\FileSystem" );
Status = NtCreateSymbolicLinkObject( &LinkHandle,
SYMBOLIC_LINK_ALL_ACCESS,
&ObjectAttributes,
&LinkTarget
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to create %Z => %Z symbolic link object (%X)\n",
&LinkName, &LinkTarget, Status );
NtTerminateProcess( NtCurrentProcess(), Status );
}
Status = NtClose( DirectoryHandle );
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to close %Z directory object handle - %lx (%X)\n",
&DirectoryName,
DirectoryHandle,
Status
);
NtTerminateProcess( NtCurrentProcess(), Status );
}
RtlInitString( &DirTypeName, "Directory" );
RtlInitString( &LinkTypeName, "SymbolicLink" );
DumpObjectDirs( "\\", 0 );
RtlInitString( &LinkName, "TestSymbolicLink" );
InitializeObjectAttributes( &ObjectAttributes,
&LinkName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
ObjectAttributes.RootDirectory = LinkHandle;
Status = NtOpenDirectoryObject( &DirectoryHandle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to open %Z directory object (%X) [OK]\n", &DirectoryName, Status );
}
Status = NtClose( LinkHandle );
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to close %Z symbolic link handle - %lx (%X)\n",
&LinkName,
LinkHandle,
Status
);
NtTerminateProcess( NtCurrentProcess(), Status );
}
InitializeObjectAttributes( &ObjectAttributes,
&DirectoryName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
Status = NtOpenDirectoryObject( &DirectoryHandle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to open %Z directory object (%X)\n", &DirectoryName, Status );
NtTerminateProcess( NtCurrentProcess(), Status );
}
Status = NtMakeTemporaryObject( DirectoryHandle );
if (!NT_SUCCESS( Status )) {
DbgPrint( "NtMakeTemporaryObject( %lx ) failed - Status == %X\n",
DirectoryHandle,
Status
);
NtTerminateProcess( NtCurrentProcess(), Status );
}
Status = NtClose( DirectoryHandle );
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to close %Z directory object handle - %lx (%X)\n",
&DirectoryName,
DirectoryHandle,
Status
);
NtTerminateProcess( NtCurrentProcess(), Status );
}
InitializeObjectAttributes( &ObjectAttributes,
&DirectoryName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
Status = NtOpenDirectoryObject( &DirectoryHandle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to open %Z directory object (%X) [OK]\n", &DirectoryName, Status );
}
RtlInitString( &DirectoryName, "\\ExclusiveDir" );
InitializeObjectAttributes( &ObjectAttributes,
&DirectoryName,
OBJ_CASE_INSENSITIVE | OBJ_EXCLUSIVE,
NULL,
NULL
);
Status = NtCreateDirectoryObject( &DirectoryHandle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to create %Z directory object (%X)\n",
&DirectoryName, Status );
NtTerminateProcess( NtCurrentProcess(), Status );
}
InitializeObjectAttributes( &ObjectAttributes,
&DirectoryName,
OBJ_CASE_INSENSITIVE | OBJ_EXCLUSIVE,
NULL,
NULL
);
Status = NtOpenDirectoryObject( &DirectoryHandle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to open %Z directory object (%X)\n",
&DirectoryName, Status );
NtTerminateProcess( NtCurrentProcess(), Status );
}
InitializeObjectAttributes( &ObjectAttributes,
&DirectoryName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
Status = NtOpenDirectoryObject( &DirectoryHandle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to open %Z directory object (%X) [OK]\n",
&DirectoryName, Status );
}
DbgPrint( "Exiting Object Manager User Mode Test Program with Status = %X\n", Status );
}
VOID
TestChild( VOID )
{
NTSTATUS Status;
STRING DirectoryName;
HANDLE DirectoryHandle;
OBJECT_ATTRIBUTES ObjectAttributes;
Status = STATUS_SUCCESS;
DbgPrint( "Entering Object Manager User Mode Child Test Program\n" );
RtlInitString( &DirectoryName, "\\ExclusiveDir" );
InitializeObjectAttributes( &ObjectAttributes,
&DirectoryName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
Status = NtOpenDirectoryObject( &DirectoryHandle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to open %Z directory object (%X) [OK]\n",
&DirectoryName, Status );
}
InitializeObjectAttributes( &ObjectAttributes,
&DirectoryName,
OBJ_CASE_INSENSITIVE | OBJ_EXCLUSIVE,
NULL,
NULL
);
Status = NtOpenDirectoryObject( &DirectoryHandle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS( Status )) {
DbgPrint( "Unable to open %Z directory object (%X) [OK]\n",
&DirectoryName, Status );
}
DbgPrint( "Exiting Object Manager User Mode Child Test Program with Status = %X\n", Status );
}