230 lines
4.3 KiB
C++
230 lines
4.3 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;
|
|||
|
}
|
|||
|
|
|||
|
|