385 lines
14 KiB
C
385 lines
14 KiB
C
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
testins1.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_U RelativeName;
|
|
PVOID FreeBuffer;
|
|
UNICODE_STRING KeyName;
|
|
UNICODE_STRING SubKeyName;
|
|
UNICODE_STRING ValueName;
|
|
HANDLE FileHandle, FindHandle, KeyHandle, SubKeyHandle;
|
|
ULONG ValueDWord = 0x12345678;
|
|
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 );
|
|
|
|
TranslationStatus = RtlDosPathNameToRelativeNtPathName_U(
|
|
L"test0",
|
|
&FileName,
|
|
NULL,
|
|
&RelativeName
|
|
);
|
|
|
|
if (TranslationStatus ) {
|
|
FreeBuffer = FileName.Buffer;
|
|
if ( RelativeName.RelativeName.Length ) {
|
|
FileName = 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 );
|
|
RtlReleaseRelativeName( &RelativeName );
|
|
RtlFreeHeap( RtlProcessHeap(), 0, FreeBuffer );
|
|
}
|
|
}
|
|
|
|
// printf( "TEST: opening .\\test1 for write access.\n" );
|
|
if (File1 = fopen( "test1.", "w" )) {
|
|
fprintf( File1, "This is test file 1\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");
|
|
}
|
|
|
|
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,
|
|
"0",
|
|
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"1" );
|
|
|
|
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"-2", L".\\test.ini" );
|
|
|
|
WritePrivateProfileSectionA( "test1", "test0=0\0test1=1\0test2=2\0", ".\\test.ini" );
|
|
|
|
WritePrivateProfileSectionW( L"test2", L"test0=0\0test1=1\0test2=2\0", L".\\test.ini" );
|
|
|
|
return 0;
|
|
}
|