149 lines
3 KiB
C
149 lines
3 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1997 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
spbasefile.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
see also
|
||
|
.\spcab.c
|
||
|
.\spbasefile.c
|
||
|
.\spbasefile.h
|
||
|
windows\winstate\...\cablib.c
|
||
|
windows\winstate\cobra\utils\main\basefile.c
|
||
|
windows\winstate\cobra\utils\inc\basefile.h
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Jay Krell (a-JayK) November 2000
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
#include "spprecmp.h"
|
||
|
#include "spstrings.h"
|
||
|
#include "spbasefile.h"
|
||
|
#include "spbasefilep.h"
|
||
|
#include "spwin.h"
|
||
|
#include "spcab.h"
|
||
|
#include "spcabp.h"
|
||
|
|
||
|
HANDLE
|
||
|
SpCreateFile1A(
|
||
|
IN PCSTR FileName
|
||
|
)
|
||
|
{
|
||
|
HANDLE Handle;
|
||
|
|
||
|
Handle = SpWin32CreateFileA(
|
||
|
FileName,
|
||
|
GENERIC_READ|GENERIC_WRITE,
|
||
|
0,
|
||
|
NULL,
|
||
|
CREATE_ALWAYS,
|
||
|
FILE_ATTRIBUTE_NORMAL,
|
||
|
NULL
|
||
|
);
|
||
|
|
||
|
if (Handle == INVALID_HANDLE_VALUE) {
|
||
|
Handle = NULL;
|
||
|
}
|
||
|
|
||
|
return Handle;
|
||
|
}
|
||
|
|
||
|
PSTR
|
||
|
SpJoinPathsA(
|
||
|
PCSTR a,
|
||
|
PCSTR b
|
||
|
)
|
||
|
{
|
||
|
// UNDONE find code elsewhere in setup that does this already
|
||
|
PSTR Result = NULL;
|
||
|
SIZE_T alen = 0;
|
||
|
SIZE_T blen = 0;
|
||
|
|
||
|
if (a == NULL)
|
||
|
goto Exit;
|
||
|
if (b == NULL)
|
||
|
goto Exit;
|
||
|
alen = strlen(a);
|
||
|
blen = strlen(b);
|
||
|
|
||
|
Result = SpMemAlloc((alen + blen + 2) * sizeof(*Result));
|
||
|
if (Result == NULL) {
|
||
|
SpSetLastWin32ErrorAndNtStatusFromNtStatus(STATUS_NO_MEMORY);
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
if (alen != 0) {
|
||
|
strcpy(Result, a);
|
||
|
if (a[alen - 1] != '\\')
|
||
|
strcat(Result, "\\");
|
||
|
}
|
||
|
strcat(Result, b);
|
||
|
Exit:
|
||
|
KdPrintEx((DPFLTR_SETUP_ID, SpPointerToDbgPrintLevel(Result), "SETUP:"__FUNCTION__" exiting\n"));
|
||
|
return Result;
|
||
|
}
|
||
|
|
||
|
HANDLE
|
||
|
SpOpenFile1A(
|
||
|
IN PCSTR Ansi
|
||
|
)
|
||
|
{
|
||
|
NTSTATUS Status = STATUS_SUCCESS;
|
||
|
BOOL Success = FALSE;
|
||
|
ANSI_STRING AnsiString = { 0 };
|
||
|
UNICODE_STRING UnicodeString = { 0 };
|
||
|
HANDLE Handle = NULL;
|
||
|
|
||
|
RtlInitAnsiString(&AnsiString, Ansi);
|
||
|
AnsiString.Length = AnsiString.MaximumLength; // include terminal nul
|
||
|
|
||
|
if (!NT_SUCCESS(Status = SpAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE)))
|
||
|
goto NtExit;
|
||
|
Handle = SpOpenFile1W(UnicodeString.Buffer);
|
||
|
if (Handle == NULL || Handle == INVALID_HANDLE_VALUE)
|
||
|
goto Exit;
|
||
|
|
||
|
Exit:
|
||
|
SpFreeStringW(&UnicodeString);
|
||
|
KdPrintEx((
|
||
|
DPFLTR_SETUP_ID,
|
||
|
SpHandleToDbgPrintLevel(Handle),
|
||
|
"SETUP:"__FUNCTION__"(%s) exiting %p\n", Ansi, Handle
|
||
|
));
|
||
|
return Handle;
|
||
|
NtExit:
|
||
|
SpSetLastWin32ErrorAndNtStatusFromNtStatus(Status);
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
HANDLE
|
||
|
SpOpenFile1W(
|
||
|
IN PCWSTR FileName
|
||
|
)
|
||
|
{
|
||
|
HANDLE Handle;
|
||
|
|
||
|
Handle = SpWin32CreateFileW(
|
||
|
FileName,
|
||
|
GENERIC_READ|GENERIC_WRITE,
|
||
|
0, // no share
|
||
|
NULL,
|
||
|
OPEN_EXISTING,
|
||
|
FILE_ATTRIBUTE_NORMAL,
|
||
|
NULL
|
||
|
);
|
||
|
|
||
|
if (Handle == INVALID_HANDLE_VALUE) {
|
||
|
Handle = NULL;
|
||
|
}
|
||
|
|
||
|
return Handle;
|
||
|
}
|