windows-nt/Source/XPSP1/NT/com/ole32/stg/props/utest/open.cxx
2020-09-26 16:20:57 +08:00

213 lines
5.1 KiB
C++

//+-----------------------------------------------------------------------
//
// File: open.cxx
//
// Synopsis: Helper functions for opening all kinds of FILE_STORAGE_TYPEs.
//
// History: 06-May-95 DaveStr created
//
// Notes:
//
//------------------------------------------------------------------------
extern "C"
{
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
}
#include <windows.h>
#include <stgint.h>
#include <stgprop.h>
#define _CAIROSTG_
#include <olecairo.h>
extern BOOL g_fOFS;
HRESULT _Open(
WCHAR *path,
FILE_STORAGE_TYPE type,
BOOL fCreate,
HANDLE *ph)
{
NTSTATUS status;
UNICODE_STRING str;
IO_STATUS_BLOCK iosb;
OBJECT_ATTRIBUTES oa;
HRESULT hr = S_OK;
if ( !RtlDosPathNameToNtPathName_U(path,&str,NULL,NULL) )
{
hr = HRESULT_FROM_NT(STATUS_OBJECT_PATH_INVALID);
}
else
{
InitializeObjectAttributes(
&oa,
&str,
OBJ_CASE_INSENSITIVE,
NULL,
(PSECURITY_DESCRIPTOR) NULL);
status = NtCreateFile(ph,
FILE_GENERIC_READ |
FILE_GENERIC_WRITE |
WRITE_OWNER |
WRITE_DAC |
SYNCHRONIZE |
DELETE,
&oa,
&iosb,
NULL,
0,
FILE_SHARE_READ,
( fCreate ) ? FILE_CREATE : 0,
FILE_SYNCHRONOUS_IO_NONALERT |
(g_fOFS ? (FILE_STORAGE_TYPE_SPECIFIED |
(type << FILE_STORAGE_TYPE_SHIFT)) : 0),
NULL,
0);
if ( !NT_SUCCESS(status) )
{
hr = HRESULT_FROM_NT(status);
}
RtlFreeUnicodeString(&str);
}
return(hr);
}
static DWORD grfmode = (STGM_READWRITE | STGM_SHARE_EXCLUSIVE);
HRESULT OpenDir(
WCHAR *path,
BOOL fCreate,
IStorage **ppistg)
{
if ( fCreate )
{
return(StgCreateStorage(path,
grfmode,
STGFMT_DIRECTORY,
NULL,
ppistg));
}
else
{
return(StgOpenStorage(path,
NULL,
grfmode,
NULL,
0,
ppistg));
}
}
HRESULT OpenFile(
WCHAR *path,
BOOL fCreate,
IStorage **ppistg)
{
if ( fCreate )
{
return(StgCreateStorage(path,
grfmode,
STGFMT_FILE,
NULL,
ppistg));
}
else
{
return(StgOpenStorage(path,
NULL,
grfmode,
NULL,
0,
ppistg));
}
}
HRESULT OpenJP(
WCHAR *path,
BOOL fCreate,
IStorage **ppistg)
{
HRESULT hr;
HANDLE h;
hr = _Open(path, StorageTypeJunctionPoint, fCreate, &h);
if ( SUCCEEDED(hr) )
{
if ( fCreate )
{
hr = StgCreateStorageOnHandle(h,
grfmode,
STGFMT_DIRECTORY,
ppistg);
}
else
{
hr = StgOpenStorageOnHandle(h,
grfmode,
ppistg);
}
NtClose(h);
}
return(hr);
}
HRESULT OpenSC(
WCHAR *path,
BOOL fCreate,
IStorage **ppistg)
{
if ( fCreate )
{
return(StgCreateStorage(path,
grfmode,
STGFMT_CATALOG,
NULL,
ppistg));
}
else
{
return(StgOpenStorage(path,
NULL,
grfmode,
NULL,
0,
ppistg));
}
}
HRESULT OpenStg(
WCHAR *path,
BOOL fCreate,
IStorage **ppistg)
{
if ( fCreate )
{
return(StgCreateStorage(path,
grfmode,
STGFMT_DOCUMENT,
NULL,
ppistg));
}
else
{
return(StgOpenStorage(path,
NULL,
grfmode,
NULL,
0,
ppistg));
}
}