Windows NT 4.0 source code leak
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

/*++
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;
}