230 lines
4.5 KiB
C++
230 lines
4.5 KiB
C++
/*++
|
||
|
||
Copyright (c) 1989-1997 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
proptest.c
|
||
|
||
Abstract:
|
||
|
||
This module contains tests for Ntfs Property support.
|
||
|
||
--*/
|
||
|
||
|
||
extern "C" {
|
||
#include <nt.h>
|
||
#include <ntioapi.h>
|
||
#include <ntrtl.h>
|
||
#include <nturtl.h>
|
||
}
|
||
|
||
#include <windows.h>
|
||
|
||
#include <stdio.h>
|
||
|
||
#include <ddeml.h> // for CP_WINUNICODE
|
||
|
||
#include <objidl.h>
|
||
|
||
extern "C"
|
||
{
|
||
#include <propapi.h>
|
||
}
|
||
|
||
#include <stgprop.h>
|
||
|
||
#include <stgvar.hxx>
|
||
#include <propstm.hxx>
|
||
#include <align.hxx>
|
||
#include <sstream.hxx>
|
||
|
||
#include <propvar.h>
|
||
|
||
|
||
//
|
||
// Simple wrapper for NtCreateFile
|
||
//
|
||
|
||
NTSTATUS
|
||
OpenObject (
|
||
WCHAR const *pwszFile,
|
||
ULONG CreateOptions,
|
||
ULONG DesiredAccess,
|
||
ULONG ShareAccess,
|
||
ULONG CreateDisposition,
|
||
HANDLE *ph)
|
||
{
|
||
NTSTATUS Status;
|
||
OBJECT_ATTRIBUTES oa;
|
||
UNICODE_STRING str;
|
||
IO_STATUS_BLOCK isb;
|
||
|
||
RtlDosPathNameToNtPathName_U(pwszFile, &str, NULL, NULL);
|
||
|
||
InitializeObjectAttributes(
|
||
&oa,
|
||
&str,
|
||
OBJ_CASE_INSENSITIVE,
|
||
NULL,
|
||
NULL);
|
||
|
||
Status = NtCreateFile(
|
||
ph,
|
||
DesiredAccess | SYNCHRONIZE,
|
||
&oa,
|
||
&isb,
|
||
NULL, // pallocationsize (none!)
|
||
FILE_ATTRIBUTE_NORMAL,
|
||
ShareAccess,
|
||
CreateDisposition,
|
||
CreateOptions,
|
||
NULL, // EA buffer (none!)
|
||
0);
|
||
|
||
RtlFreeHeap(RtlProcessHeap(), 0, str.Buffer);
|
||
return(Status);
|
||
}
|
||
|
||
|
||
void
|
||
SzToWsz (
|
||
OUT WCHAR *Unicode,
|
||
IN char *Ansi
|
||
)
|
||
{
|
||
while (*Unicode++ = *Ansi++)
|
||
;
|
||
}
|
||
|
||
void
|
||
OpenTest (
|
||
char *FileName
|
||
)
|
||
{
|
||
NTSTATUS Status;
|
||
HANDLE Handle;
|
||
WCHAR WFileName[MAX_PATH];
|
||
char InputBuffer[10];
|
||
char OutputBuffer[200];
|
||
IO_STATUS_BLOCK Iosb;
|
||
|
||
|
||
//
|
||
// OPENTEST file count
|
||
//
|
||
|
||
//
|
||
// Create the new file
|
||
//
|
||
|
||
SzToWsz( WFileName, FileName );
|
||
|
||
Status = OpenObject( WFileName,
|
||
FILE_SYNCHRONOUS_IO_NONALERT,
|
||
FILE_READ_DATA | FILE_WRITE_DATA,
|
||
FALSE,
|
||
FILE_CREATE,
|
||
&Handle );
|
||
|
||
if (!NT_SUCCESS( Status )) {
|
||
printf( "Unable to open %s - %x\n", FileName, Status );
|
||
}
|
||
|
||
//
|
||
// Write a small amount of data
|
||
//
|
||
|
||
Status = NtWriteFile( Handle, NULL, NULL, NULL, &Iosb, InputBuffer, 10, NULL, NULL );
|
||
if (!NT_SUCCESS( Status )) {
|
||
printf( "Unable to write %s - %x\n", FileName, Status );
|
||
}
|
||
|
||
//
|
||
// Close the file
|
||
//
|
||
|
||
Status = NtClose( Handle );
|
||
if (!NT_SUCCESS( Status )) {
|
||
printf( "Unable to close %s - %x\n", FileName, Status );
|
||
}
|
||
|
||
//
|
||
// Overwrite the file
|
||
//
|
||
|
||
Status = OpenObject( WFileName,
|
||
FILE_SYNCHRONOUS_IO_NONALERT,
|
||
FILE_READ_DATA | FILE_WRITE_DATA,
|
||
FALSE,
|
||
FILE_OVERWRITE,
|
||
&Handle );
|
||
|
||
if (!NT_SUCCESS( Status )) {
|
||
printf( "Unable to overwrite %s - %x\n", FileName, Status );
|
||
}
|
||
|
||
//
|
||
// Write a small amount of data
|
||
//
|
||
|
||
Status = NtWriteFile( Handle, NULL, NULL, NULL, &Iosb, InputBuffer, 10, NULL, NULL );
|
||
if (!NT_SUCCESS( Status )) {
|
||
printf( "Unable to write %s - %x\n", FileName, Status );
|
||
}
|
||
|
||
//
|
||
// Close the file
|
||
//
|
||
|
||
Status = NtClose( Handle );
|
||
if (!NT_SUCCESS( Status )) {
|
||
printf( "Unable to close %s - %x\n", FileName, Status );
|
||
}
|
||
|
||
//
|
||
// Delete the file
|
||
//
|
||
|
||
{
|
||
OBJECT_ATTRIBUTES oa;
|
||
UNICODE_STRING str;
|
||
|
||
RtlDosPathNameToNtPathName_U( WFileName, &str, NULL, NULL );
|
||
|
||
InitializeObjectAttributes(
|
||
&oa,
|
||
&str,
|
||
OBJ_CASE_INSENSITIVE,
|
||
NULL,
|
||
NULL);
|
||
|
||
Status = NtDeleteFile( &oa );
|
||
|
||
RtlFreeHeap(RtlProcessHeap(), 0, str.Buffer);
|
||
|
||
if (!NT_SUCCESS( Status )) {
|
||
printf( "Unable to delete %s - %x\n", FileName, Status );
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
int __cdecl
|
||
main (
|
||
int argc,
|
||
char **argv)
|
||
{
|
||
DbgPrint( "--------------------------------------------\n" );
|
||
while (--argc != 0) {
|
||
OpenTest( *++argv );
|
||
}
|
||
DbgPrint( "--------------------------------------------\n" );
|
||
return 0;
|
||
}
|
||
|
||
|