windows-nt/Source/XPSP1/NT/base/ntsetup/textmode/kernel/spbasefile.c

149 lines
3 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
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;
}