You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
5.3 KiB
212 lines
5.3 KiB
//+-----------------------------------------------------------------------
|
|
//
|
|
// 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));
|
|
}
|
|
}
|