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

387 lines
14 KiB
C

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
testins2.c
Abstract:
This is a test program that issues various Kernel 32 file/registry/INI file
API calls so that we can see if the INSTALER program figures out correctly
what is being done.
Author:
Steve Wood (stevewo) 13-Aug-1994
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>
UCHAR AnsiBuffer[ MAX_PATH ];
WCHAR UnicodeBuffer[ MAX_PATH ];
int
__cdecl
main(
int argc,
char *argv[]
)
{
FILE *File0;
FILE *File1;
FILE *File2;
NTSTATUS Status;
IO_STATUS_BLOCK IoStatusBlock;
OBJECT_ATTRIBUTES ObjectAttributes;
BOOLEAN TranslationStatus;
UNICODE_STRING FileName;
RTL_RELATIVE_NAME RelativeName;
PVOID FreeBuffer;
UNICODE_STRING KeyName;
UNICODE_STRING SubKeyName;
UNICODE_STRING ValueName;
HANDLE FileHandle, FindHandle, KeyHandle, SubKeyHandle;
ULONG ValueDWord = 0x12345679;
WIN32_FIND_DATAW FindFileData;
LPSTR s1;
PWSTR s2;
UCHAR AnsiBuffer[ MAX_PATH ];
WCHAR UnicodeBuffer[ MAX_PATH ];
DWORD dwVersion;
OSVERSIONINFO VersionInfo;
HKEY hKey;
//
// File operations we want to test:
//
// Creating a new file.
// Deleting that file using DeleteFile (which does NtOpenFile and NtSetInformationFile
// with Delete Dispostion). (INSTALER should use this to forget about create).
// Creating a new file with the same name.
// Deleting that file using NtDeleteFile. (again INSTALER should not care).
//
// Open the TEST1 file for read access (INSTALER should not care).
// Open the TEST2 file for write access (INSTALER should not care).
// Open the TEST2 file for write access (INSTALER should not care).
// Open the TEST2 file for write access (INSTALER should not care).
//
//
// printf( "TEST: GetFileAttributes( .\\test1 )\n" );
GetFileAttributesA( ".\\test1" );
#if 0
dwVersion = GetVersion();
if ((dwVersion >> 30) ^ 0x2 == VER_PLATFORM_WIN32_WINDOWS) {
printf( "GetVersion returns Windows 95\n" );
}
else
if ((dwVersion >> 30) ^ 0x2 == VER_PLATFORM_WIN32_NT) {
printf( "GetVersion returns Windows NT\n" );
}
else {
printf( "GetVersion returns %x\n", dwVersion );
}
fflush(stdout);
VersionInfo.dwOSVersionInfoSize = sizeof( VersionInfo );
GetVersionEx( &VersionInfo );
if (VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
printf( "GetVersionEx returns Windows 95\n" );
}
else
if (VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) {
printf( "GetVersionEx returns Windows NT\n" );
}
else {
printf( "GetVersionEx returns %x\n", VersionInfo.dwPlatformId );
}
fflush(stdout);
if (RegConnectRegistryA( "\\\\stevewo_dbgr", HKEY_USERS, &hKey )) {
printf( "RegConnectRegistryA( \\stevewo_dbgr ) failed (hKey == %x).\n", hKey );
}
else {
printf( "RegConnectRegistryA( \\stevewo_dbgr ) succeeded (hKey == %x).\n", hKey );
RegCloseKey( hKey );
}
if (RegConnectRegistryW( L"\\\\stevewo_dbgr", HKEY_USERS, &hKey )) {
printf( "RegConnectRegistryW( \\stevewo_dbgr ) failed (hKey == %x).\n", hKey );
}
else {
printf( "RegConnectRegistryW( \\stevewo_dbgr ) succeeded (hKey == %x).\n", hKey );
RegCloseKey( hKey );
}
#endif
RtlInitUnicodeString( &FileName, L"\\DosDevices\\A:" );
InitializeObjectAttributes( &ObjectAttributes,
&FileName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
// printf( "TEST: NtOpenFile( %wZ ) should succeed without touching floppy.\n", &FileName );
Status = NtOpenFile( &FileHandle,
SYNCHRONIZE | FILE_READ_ATTRIBUTES,
&ObjectAttributes,
&IoStatusBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE
);
if (!NT_SUCCESS( Status )) {
printf( "TEST: Failed - Status == %x\n", Status );
}
else {
NtClose( FileHandle );
}
// printf( "TEST: FindFirstFileW( C:\\*.* should fail.\n" );
FindHandle = FindFirstFileW( L"C:\\*.*", &FindFileData );
if (FindHandle != INVALID_HANDLE_VALUE) {
printf( "TEST: *** oops, it worked.\n" );
FindClose( FindHandle );
}
// printf( "TEST: FindFirstFileW( \\TMP\\*.* should work.\n" );
FindHandle = FindFirstFileW( L"\\TMP\\*.*", &FindFileData );
if (FindHandle == INVALID_HANDLE_VALUE) {
printf( "TEST: *** oops, it failed.\n" );
}
else {
FindClose( FindHandle );
}
// printf( "TEST: opening .\\test0 for write access.\n" );
if (File0 = fopen( "test0.", "w" )) {
fprintf( File0, "This is test file 0\n" );
// printf( "TEST: closing .\\test0\n" );
fclose( File0 );
// printf( "TEST: deleting .\\test0 using DeleteFile (open, set, close)\n" );
DeleteFile( L"test0" );
}
// printf( "TEST: opening .\\test0 for write access.\n" );
if (File0 = fopen( "test0.", "w" )) {
fprintf( File0, "This is test file 0\n" );
// printf( "TEST: closing .\\test0\n" );
fclose( File0 );
#if 0
TranslationStatus = RtlDosPathNameToNtPathName_U(
L"test0",
&FileName,
NULL,
&RelativeName
);
if (TranslationStatus ) {
FreeBuffer = FileName.Buffer;
if ( RelativeName.RelativeName.Length ) {
FileName = *(PUNICODE_STRING)&RelativeName.RelativeName;
}
else {
RelativeName.ContainingDirectory = NULL;
}
InitializeObjectAttributes( &ObjectAttributes,
&FileName,
OBJ_CASE_INSENSITIVE,
RelativeName.ContainingDirectory,
NULL
);
// printf( "TEST: deleting .\\test0 using NtDeleteFile\n" );
Status = NtDeleteFile( &ObjectAttributes );
RtlFreeHeap( RtlProcessHeap(), 0, FreeBuffer );
}
#endif
}
// printf( "TEST: opening .\\test1 for write access.\n" );
if (File1 = fopen( "test1.", "w" )) {
fprintf( File1, "This is test file 1a\n" );
// printf( "TEST: closing .\\test1\n" );
fclose( File1 );
}
// printf( "TEST: opening .\\test2 for write access (Instaler should noticed contents different)\n" );
if (File2 = fopen( "test2.", "w" )) {
fprintf( File2, "This is test file 2\n" );
// printf( "TEST: closing .\\test2\n" );
fclose( File2 );
}
// printf( "TEST: opening .\\test0.tmp for write access.\n" );
if (File0 = fopen( "test0.tmp", "w" )) {
fprintf( File0, "This is test file tmp files\n" );
// printf( "TEST: closing .\\test0.tmp\n" );
fclose( File0 );
// printf( "TEST: deleting .\\test0 using DeleteFile (open, set, close)\n" );
rename("test0.tmp", "test0.fin");
}
rename("test1.", "test2.fin");
rename("test3.", "test3.fin");
RtlInitUnicodeString( &KeyName, L"\\Registry\\Machine\\Software\\Test" );
InitializeObjectAttributes( &ObjectAttributes,
&KeyName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
// printf( "TEST: opening %wZ for write access\n", &KeyName );
Status = NtOpenKey( &KeyHandle,
KEY_WRITE,
&ObjectAttributes
);
if (NT_SUCCESS( Status )) {
RtlInitUnicodeString( &ValueName, L"Test0" );
// printf( "TEST: setting %wZ . %wZ value\n", &KeyName, &ValueName );
Status = NtSetValueKey( KeyHandle,
&ValueName,
0,
REG_SZ,
"1",
2 * sizeof( WCHAR )
);
RtlInitUnicodeString( &ValueName, L"Test1" );
// printf( "TEST: deleting %wZ . %wZ value\n", &KeyName, &ValueName );
Status = NtDeleteValueKey( KeyHandle,
&ValueName
);
RtlInitUnicodeString( &ValueName, L"Test2" );
// printf( "TEST: setting %wZ . %wZ value\n", &KeyName, &ValueName );
Status = NtSetValueKey( KeyHandle,
&ValueName,
0,
REG_DWORD,
&ValueDWord,
sizeof( ValueDWord )
);
RtlInitUnicodeString( &SubKeyName, L"Test3" );
InitializeObjectAttributes( &ObjectAttributes,
&SubKeyName,
OBJ_CASE_INSENSITIVE,
KeyHandle,
NULL
);
// printf( "TEST: opening %wZ\\%wZ for write access\n", &KeyName, &SubKeyName );
Status = NtOpenKey( &SubKeyHandle,
DELETE | KEY_WRITE,
&ObjectAttributes
);
if (NT_SUCCESS( Status )) {
// printf( "TEST: deleting %wZ\\%wZ key and values\n", &KeyName, &SubKeyName );
Status = NtDeleteKey( SubKeyHandle );
NtClose( SubKeyHandle );
}
RtlInitUnicodeString( &SubKeyName, L"Test4" );
InitializeObjectAttributes( &ObjectAttributes,
&SubKeyName,
OBJ_CASE_INSENSITIVE,
KeyHandle,
NULL
);
// printf( "TEST: creating %wZ\\%wZ for write access\n", &KeyName, &SubKeyName );
Status = NtCreateKey( &SubKeyHandle,
DELETE | KEY_WRITE,
&ObjectAttributes,
0,
NULL,
0,
NULL
);
if (NT_SUCCESS( Status )) {
RtlInitUnicodeString( &ValueName, L"Test4" );
// printf( "TEST: creating %wZ\\%wZ %wZ value\n", &KeyName, &SubKeyName, &ValueName );
Status = NtSetValueKey( SubKeyHandle,
&ValueName,
0,
REG_DWORD,
&ValueDWord,
sizeof( ValueDWord )
);
NtClose( SubKeyHandle );
}
RtlInitUnicodeString( &SubKeyName, L"Test5" );
InitializeObjectAttributes( &ObjectAttributes,
&SubKeyName,
OBJ_CASE_INSENSITIVE,
KeyHandle,
NULL
);
// printf( "TEST: creating %wZ\\%wZ for write access\n", &KeyName, &SubKeyName );
Status = NtCreateKey( &SubKeyHandle,
DELETE | KEY_WRITE,
&ObjectAttributes,
0,
NULL,
0,
NULL
);
if (NT_SUCCESS( Status )) {
RtlInitUnicodeString( &ValueName, L"Test5" );
// printf( "TEST: creating %wZ\\%wZ %wZ value\n", &KeyName, &SubKeyName, &ValueName );
Status = NtSetValueKey( SubKeyHandle,
&ValueName,
0,
REG_DWORD,
&ValueDWord,
sizeof( ValueDWord )
);
// printf( "TEST: deleting %wZ\\%wZ key and values\n", &KeyName, &SubKeyName );
Status = NtDeleteKey( SubKeyHandle );
NtClose( SubKeyHandle );
}
NtClose( KeyHandle );
}
GetPrivateProfileStringA( "test", NULL, "",
AnsiBuffer,
sizeof( AnsiBuffer ),
".\\test.ini"
);
GetPrivateProfileStringW( L"test", NULL, L"",
UnicodeBuffer,
sizeof( UnicodeBuffer ),
L".\\test.ini"
);
if (!SetCurrentDirectoryA( ".." )) {
printf( "TEST: SetCurrentDirectory to '..' failed (%u)\n", GetLastError() );
}
WriteProfileString( L"fonts", L"FooBar", L"2" );
WriteProfileString( L"fonts", L"Rockwell Italic (TrueType)", L"ROCKI.FOT" );
if (!SetCurrentDirectoryW( L"test" )) {
printf( "TEST: SetCurrentDirectory to 'test' failed (%u)\n", GetLastError() );
}
WritePrivateProfileStringA( "test", "test1", "-1", ".\\test.ini" );
WritePrivateProfileStringW( L"test", L"test1", L"-3", L".\\test.ini" );
WritePrivateProfileSectionA( "test1", "test0=0\0test1=1\0test2=2\0", ".\\test.ini" );
WritePrivateProfileSectionW( L"test2", L"test0=0\0test1=2\0test2=2\0", L".\\test.ini" );
return 0;
}