mirror of https://github.com/lianthony/NT4.0
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.
157 lines
3.2 KiB
157 lines
3.2 KiB
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
dllpipe.c
|
|
|
|
Abstract:
|
|
|
|
This module implements the OS/2 V2.0 DosCreatePipe() API.
|
|
It uses the Named Pipes implementation to get the desired functionality.
|
|
|
|
Author:
|
|
|
|
Beni Lavi (BeniL) 29-Dec-1991
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#define INCL_OS2V20_PIPES
|
|
#define INCL_OS2V20_ERRORS
|
|
#define INCL_OS2V20_FILESYS
|
|
#include "os2dll.h"
|
|
#define INCL_DOSNMPIPES
|
|
#include "os2dll16.h"
|
|
|
|
ULONG PipeSerialNumber;
|
|
#define OS2_SS_PIPE_NAME_STRING "\\pipe\\os2ss"
|
|
|
|
APIRET
|
|
DosCreatePipe(
|
|
OUT PHFILE phfRead,
|
|
OUT PHFILE phfWrite,
|
|
IN ULONG PipeSize
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine creates an anonymous pipe.
|
|
|
|
Arguments:
|
|
|
|
phfRead - read handle to pipe
|
|
|
|
phfWrite - write handle to pipe
|
|
|
|
PipeSize - size of pipe
|
|
|
|
Return Value:
|
|
|
|
ERROR_TOO_MANY_OPEN_FILES - no free file handles.
|
|
|
|
--*/
|
|
|
|
{
|
|
APIRET RetCode;
|
|
HFILE ReadHandle, WriteHandle;
|
|
ULONG ActionTaken;
|
|
UCHAR PipeNameBuffer[ 32 ];
|
|
ULONG nSize;
|
|
char *p;
|
|
PFILE_HANDLE hFileRecord;
|
|
|
|
#if DBG
|
|
PSZ RoutineName;
|
|
RoutineName = "DosCreatePipe";
|
|
#endif
|
|
|
|
|
|
//
|
|
// probe user parameters
|
|
//
|
|
|
|
try {
|
|
*phfWrite = 0;
|
|
*phfRead = 0;
|
|
} except( EXCEPTION_EXECUTE_HANDLER ) {
|
|
Od2ExitGP();
|
|
}
|
|
|
|
if (PipeSize == 0) {
|
|
nSize = 4096;
|
|
}
|
|
else {
|
|
nSize = PipeSize;
|
|
}
|
|
|
|
//
|
|
// Generate a pipe name according to the OS/2 convensions
|
|
//
|
|
|
|
strcpy(PipeNameBuffer, OS2_SS_PIPE_NAME_STRING);
|
|
p = &PipeNameBuffer[strlen(PipeNameBuffer)];
|
|
RtlIntegerToChar((ULONG)NtCurrentTeb()->ClientId.UniqueProcess, 10, 8, p);
|
|
p = &PipeNameBuffer[strlen(PipeNameBuffer)];
|
|
*p++ = '.';
|
|
RtlIntegerToChar(PipeSerialNumber++, 10, 8, p);
|
|
|
|
RetCode = DosCreateNPipe(
|
|
PipeNameBuffer,
|
|
&ReadHandle,
|
|
NP_ACCESS_INBOUND | NP_INHERIT | NP_NOWRITEBEHIND,
|
|
NP_WAIT | NP_READMODE_BYTE | NP_TYPE_BYTE | 1,
|
|
nSize,
|
|
nSize,
|
|
(ULONG)((LONG)NP_INDEFINITE_WAIT)
|
|
);
|
|
|
|
if (RetCode != NO_ERROR) {
|
|
return(RetCode);
|
|
}
|
|
|
|
RetCode = DosOpen(
|
|
PipeNameBuffer,
|
|
&WriteHandle,
|
|
&ActionTaken,
|
|
0, // FileSize
|
|
0, // Created file attributes
|
|
FILE_OPEN,
|
|
OPEN_ACCESS_WRITEONLY | OPEN_SHARE_DENYNONE | OPEN_FLAGS_WRITE_THROUGH,
|
|
0
|
|
);
|
|
|
|
if (RetCode != NO_ERROR) {
|
|
return(RetCode);
|
|
}
|
|
|
|
AcquireFileLockShared(
|
|
#if DBG
|
|
RoutineName
|
|
#endif
|
|
);
|
|
|
|
//
|
|
// Mark Handles type PIPE.
|
|
//
|
|
RetCode = DereferenceFileHandle(ReadHandle, &hFileRecord);
|
|
hFileRecord->FileType = FILE_TYPE_PIPE;
|
|
RetCode = DereferenceFileHandle(WriteHandle, &hFileRecord);
|
|
hFileRecord->FileType = FILE_TYPE_PIPE;
|
|
|
|
ReleaseFileLockShared(
|
|
#if DBG
|
|
RoutineName
|
|
#endif
|
|
);
|
|
|
|
|
|
*phfWrite = WriteHandle;
|
|
*phfRead = ReadHandle;
|
|
|
|
return NO_ERROR;
|
|
}
|