142 lines
2.7 KiB
C
142 lines
2.7 KiB
C
/*++
|
||
|
||
Copyright (c) 1991 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
openstrm.c
|
||
|
||
Abstract:
|
||
|
||
This module implements the STREAMS APIs, s_open() and OpenStream().
|
||
|
||
Author:
|
||
|
||
Sam Patton (sampa) November, 1991
|
||
Eric Chin (ericc) July 17, 1992
|
||
|
||
Revision History:
|
||
|
||
|
||
--*/
|
||
#include "common.h"
|
||
|
||
|
||
|
||
|
||
HANDLE
|
||
s_open(
|
||
IN char *path,
|
||
IN int oflag,
|
||
IN int ignored
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function opens a stream.
|
||
|
||
Arguments:
|
||
|
||
path - path to the STREAMS driver
|
||
oflag - currently ignored. In the future, O_NONBLOCK will be
|
||
relevant.
|
||
ignored - not used
|
||
|
||
Return Value:
|
||
|
||
An NT handle for the stream, or INVALID_HANDLE_VALUE if unsuccessful.
|
||
|
||
--*/
|
||
|
||
{
|
||
HANDLE StreamHandle;
|
||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||
IO_STATUS_BLOCK IoStatusBlock;
|
||
STRING name_string;
|
||
UNICODE_STRING uc_name_string;
|
||
PFILE_FULL_EA_INFORMATION EaBuffer;
|
||
char Buffer[sizeof(FILE_FULL_EA_INFORMATION) + NORMAL_STREAM_EA_LENGTH + 1];
|
||
NTSTATUS Status;
|
||
|
||
RtlInitString(&name_string, path);
|
||
RtlAnsiStringToUnicodeString(&uc_name_string, &name_string, TRUE);
|
||
|
||
InitializeObjectAttributes(
|
||
&ObjectAttributes,
|
||
&uc_name_string,
|
||
OBJ_CASE_INSENSITIVE,
|
||
(HANDLE) NULL,
|
||
(PSECURITY_DESCRIPTOR) NULL
|
||
);
|
||
|
||
EaBuffer = (PFILE_FULL_EA_INFORMATION) Buffer;
|
||
|
||
EaBuffer->NextEntryOffset = 0;
|
||
EaBuffer->Flags = 0;
|
||
EaBuffer->EaNameLength = NORMAL_STREAM_EA_LENGTH;
|
||
EaBuffer->EaValueLength = 0;
|
||
|
||
RtlMoveMemory(
|
||
EaBuffer->EaName,
|
||
NormalStreamEA,
|
||
NORMAL_STREAM_EA_LENGTH + 1);
|
||
|
||
Status =
|
||
NtCreateFile(
|
||
&StreamHandle,
|
||
SYNCHRONIZE | FILE_READ_DATA | FILE_WRITE_DATA,
|
||
&ObjectAttributes,
|
||
&IoStatusBlock,
|
||
NULL,
|
||
FILE_ATTRIBUTE_NORMAL,
|
||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||
FILE_OPEN_IF,
|
||
0,
|
||
EaBuffer,
|
||
sizeof(FILE_FULL_EA_INFORMATION) - 1 +
|
||
EaBuffer->EaNameLength + 1);
|
||
|
||
RtlFreeUnicodeString(&uc_name_string);
|
||
|
||
if (Status != STATUS_SUCCESS) {
|
||
SetLastError(MapNtToPosixStatus(Status));
|
||
return(INVALID_HANDLE_VALUE);
|
||
} else {
|
||
return(StreamHandle);
|
||
}
|
||
|
||
} // s_open
|
||
|
||
|
||
|
||
HANDLE
|
||
OpenStream(
|
||
IN char *AdapterName
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function is used by the TCP/IP Utilities to open STREAMS drivers.
|
||
|
||
It was exported by the winstrm.dll included in the July, 1992 PDC
|
||
release. Hence, it will continue to be exported by winstrm.dll.
|
||
|
||
Arguments:
|
||
|
||
AdapterName - path of the STREAMS driver
|
||
|
||
Return Value:
|
||
|
||
An NT handle, or INVALID_HANDLE_VALUE if unsuccessful.
|
||
|
||
--*/
|
||
|
||
{
|
||
return( s_open(AdapterName, 2, 0) );
|
||
|
||
} // OpenStream
|