417 lines
12 KiB
C
417 lines
12 KiB
C
/*++
|
||
|
||
Copyright (c) 1989 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
create.c
|
||
|
||
Abstract
|
||
|
||
This module contains the code to implement the NtCreateFile,
|
||
the NtCreateNamedPipeFile and the NtCreateMailslotFile system
|
||
services.
|
||
|
||
Author:
|
||
|
||
Darryl E. Havens (darrylh) 14-Apr-1989
|
||
|
||
Environment:
|
||
|
||
Kernel mode
|
||
|
||
Revision History:
|
||
|
||
|
||
--*/
|
||
|
||
#include "iop.h"
|
||
|
||
#ifdef ALLOC_PRAGMA
|
||
#pragma alloc_text(PAGE, NtCreateFile)
|
||
#pragma alloc_text(PAGE, NtCreateNamedPipeFile)
|
||
#pragma alloc_text(PAGE, NtCreateMailslotFile)
|
||
#endif
|
||
|
||
NTSTATUS
|
||
NtCreateFile(
|
||
OUT PHANDLE FileHandle,
|
||
IN ACCESS_MASK DesiredAccess,
|
||
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||
IN PLARGE_INTEGER AllocationSize OPTIONAL,
|
||
IN ULONG FileAttributes,
|
||
IN ULONG ShareAccess,
|
||
IN ULONG CreateDisposition,
|
||
IN ULONG CreateOptions,
|
||
IN PVOID EaBuffer OPTIONAL,
|
||
IN ULONG EaLength
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This service opens or creates a file, or opens a device. It is used to
|
||
establish a file handle to the open device/file that can then be used
|
||
in subsequent operations to perform I/O operations on. For purposes of
|
||
readability, files and devices are treated as "files" throughout the
|
||
majority of this module and the system service portion of the I/O system.
|
||
The only time a distinction is made is when it is important to determine
|
||
which is really being accessed. Then a distinction is also made in the
|
||
comments.
|
||
|
||
Arguments:
|
||
|
||
FileHandle - A pointer to a variable to receive the handle to the open file.
|
||
|
||
DesiredAccess - Supplies the types of access that the caller would like to
|
||
the file.
|
||
|
||
ObjectAttributes - Supplies the attributes to be used for file object (name,
|
||
SECURITY_DESCRIPTOR, etc.)
|
||
|
||
IoStatusBlock - Specifies the address of the caller's I/O status block.
|
||
|
||
AllocationSize - Initial size that should be allocated to the file. This
|
||
parameter only has an affect if the file is created. Further, if
|
||
not specified, then it is taken to mean zero.
|
||
|
||
FileAttributes - Specifies the attributes that should be set on the file,
|
||
if it is created.
|
||
|
||
ShareAccess - Supplies the types of share access that the caller would like
|
||
to the file.
|
||
|
||
CreateDisposition - Supplies the method for handling the create/open.
|
||
|
||
CreateOptions - Caller options for how to perform the create/open.
|
||
|
||
EaBuffer - Optionally specifies a set of EAs to be applied to the file if
|
||
it is created.
|
||
|
||
EaLength - Supplies the length of the EaBuffer.
|
||
|
||
Return Value:
|
||
|
||
The function value is the final status of the create/open operation.
|
||
|
||
--*/
|
||
|
||
{
|
||
//
|
||
// Simply invoke the common I/O file creation routine to do the work.
|
||
//
|
||
|
||
PAGED_CODE();
|
||
|
||
return IoCreateFile( FileHandle,
|
||
DesiredAccess,
|
||
ObjectAttributes,
|
||
IoStatusBlock,
|
||
AllocationSize,
|
||
FileAttributes,
|
||
ShareAccess,
|
||
CreateDisposition,
|
||
CreateOptions,
|
||
EaBuffer,
|
||
EaLength,
|
||
CreateFileTypeNone,
|
||
(PVOID)NULL,
|
||
0 );
|
||
}
|
||
|
||
NTSTATUS
|
||
NtCreateNamedPipeFile(
|
||
OUT PHANDLE FileHandle,
|
||
IN ULONG DesiredAccess,
|
||
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||
IN ULONG ShareAccess,
|
||
IN ULONG CreateDisposition,
|
||
IN ULONG CreateOptions,
|
||
IN ULONG NamedPipeType,
|
||
IN ULONG ReadMode,
|
||
IN ULONG CompletionMode,
|
||
IN ULONG MaximumInstances,
|
||
IN ULONG InboundQuota,
|
||
IN ULONG OutboundQuota,
|
||
IN PLARGE_INTEGER DefaultTimeout OPTIONAL
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Creates and opens the server end handle of the first instance of a
|
||
specific named pipe or another instance of an existing named pipe.
|
||
|
||
Arguments:
|
||
|
||
FileHandle - Supplies a handle to the file on which the service is being
|
||
performed.
|
||
|
||
DesiredAccess - Supplies the types of access that the caller would like to
|
||
the file.
|
||
|
||
ObjectAttributes - Supplies the attributes to be used for file object
|
||
(name, SECURITY_DESCRIPTOR, etc.)
|
||
|
||
IoStatusBlock - Address of the caller's I/O status block.
|
||
|
||
ShareAccess - Supplies the types of share access that the caller would
|
||
like to the file.
|
||
|
||
CreateDisposition - Supplies the method for handling the create/open.
|
||
|
||
CreateOptions - Caller options for how to perform the create/open.
|
||
|
||
NamedPipeType - Type of named pipe to create (Bitstream or message).
|
||
|
||
ReadMode - Mode in which to read the pipe (Bitstream or message).
|
||
|
||
CompletionMode - Specifies how the operation is to be completed.
|
||
|
||
MaximumInstances - Maximum number of simultaneous instances of the named
|
||
pipe.
|
||
|
||
InboundQuota - Specifies the pool quota that is reserved for writes to the
|
||
inbound side of the named pipe.
|
||
|
||
OutboundQuota - Specifies the pool quota that is reserved for writes to
|
||
the inbound side of the named pipe.
|
||
|
||
DefaultTimeout - Optional pointer to a timeout value that is used if a
|
||
timeout value is not specified when waiting for an instance of a named
|
||
pipe.
|
||
|
||
Return Value:
|
||
|
||
The function value is the final status of the create/open operation.
|
||
|
||
--*/
|
||
|
||
{
|
||
NAMED_PIPE_CREATE_PARAMETERS namedPipeCreateParameters;
|
||
|
||
PAGED_CODE();
|
||
|
||
//
|
||
// Check whether or not the DefaultTimeout parameter was specified. If
|
||
// so, then capture it in the named pipe create parameter structure.
|
||
//
|
||
|
||
if (ARGUMENT_PRESENT( DefaultTimeout )) {
|
||
|
||
//
|
||
// Indicate that a default timeout period was specified.
|
||
//
|
||
|
||
namedPipeCreateParameters.TimeoutSpecified = TRUE;
|
||
|
||
//
|
||
// A default timeout parameter was specified. Check to see whether
|
||
// the caller's mode is kernel and if not capture the parameter inside
|
||
// of a try...except clause.
|
||
//
|
||
|
||
if (KeGetPreviousMode() != KernelMode) {
|
||
try {
|
||
ProbeForRead( DefaultTimeout,
|
||
sizeof( LARGE_INTEGER ),
|
||
sizeof( ULONG ) );
|
||
namedPipeCreateParameters.DefaultTimeout = *DefaultTimeout;
|
||
} except(EXCEPTION_EXECUTE_HANDLER) {
|
||
|
||
//
|
||
// Something went awry attempting to access the parameter.
|
||
// Get the reason for the error and return it as the status
|
||
// value from this service.
|
||
//
|
||
|
||
return GetExceptionCode();
|
||
}
|
||
} else {
|
||
|
||
//
|
||
// The caller's mode was kernel so simply store the parameter.
|
||
//
|
||
|
||
namedPipeCreateParameters.DefaultTimeout = *DefaultTimeout;
|
||
}
|
||
} else {
|
||
|
||
//
|
||
// Indicate that no default timeout period was specified.
|
||
//
|
||
|
||
namedPipeCreateParameters.TimeoutSpecified = FALSE;
|
||
}
|
||
|
||
//
|
||
// Store the remainder of the named pipe-specific parameters in the
|
||
// structure for use in the call to the common create file routine.
|
||
//
|
||
|
||
namedPipeCreateParameters.NamedPipeType = NamedPipeType;
|
||
namedPipeCreateParameters.ReadMode = ReadMode;
|
||
namedPipeCreateParameters.CompletionMode = CompletionMode;
|
||
namedPipeCreateParameters.MaximumInstances = MaximumInstances;
|
||
namedPipeCreateParameters.InboundQuota = InboundQuota;
|
||
namedPipeCreateParameters.OutboundQuota = OutboundQuota;
|
||
|
||
//
|
||
// Simply perform the remainder of the service by allowing the common
|
||
// file creation code to do the work.
|
||
//
|
||
|
||
return IoCreateFile( FileHandle,
|
||
DesiredAccess,
|
||
ObjectAttributes,
|
||
IoStatusBlock,
|
||
(PLARGE_INTEGER) NULL,
|
||
0L,
|
||
ShareAccess,
|
||
CreateDisposition,
|
||
CreateOptions,
|
||
(PVOID) NULL,
|
||
0L,
|
||
CreateFileTypeNamedPipe,
|
||
&namedPipeCreateParameters,
|
||
0 );
|
||
}
|
||
|
||
NTSTATUS
|
||
NtCreateMailslotFile(
|
||
OUT PHANDLE FileHandle,
|
||
IN ULONG DesiredAccess,
|
||
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||
ULONG CreateOptions,
|
||
IN ULONG MailslotQuota,
|
||
IN ULONG MaximumMessageSize,
|
||
IN PLARGE_INTEGER ReadTimeout
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Creates and opens the server end handle of a mailslot file.
|
||
|
||
Arguments:
|
||
|
||
FileHandle - Supplies a handle to the file on which the service is being
|
||
performed.
|
||
|
||
DesiredAccess - Supplies the types of access that the caller would like to
|
||
the file.
|
||
|
||
ObjectAttributes - Supplies the attributes to be used for file object
|
||
(name, SECURITY_DESCRIPTOR, etc.)
|
||
|
||
IoStatusBlock - Address of the caller's I/O status block.
|
||
|
||
CreateOptions - Caller options for how to perform the create/open.
|
||
|
||
MailslotQuota - Specifies the pool quota that is reserved for writes
|
||
to this mailslot.
|
||
|
||
MaximumMessageSize - Specifies the size of the largest message that
|
||
can be written to this mailslot.
|
||
|
||
ReadTimeout - The timeout period for a read operation. This must
|
||
be specified as a relative time.
|
||
|
||
Return Value:
|
||
|
||
The function value is the final status of the create operation.
|
||
|
||
--*/
|
||
|
||
{
|
||
MAILSLOT_CREATE_PARAMETERS mailslotCreateParameters;
|
||
|
||
PAGED_CODE();
|
||
|
||
//
|
||
// Check whether or not the DefaultTimeout parameter was specified. If
|
||
// so, then capture it in the mailslot create parameter structure.
|
||
//
|
||
|
||
if (ARGUMENT_PRESENT( ReadTimeout )) {
|
||
|
||
//
|
||
// Indicate that a read timeout period was specified.
|
||
//
|
||
|
||
mailslotCreateParameters.TimeoutSpecified = TRUE;
|
||
|
||
//
|
||
// A read timeout parameter was specified. Check to see whether
|
||
// the caller's mode is kernel and if not capture the parameter inside
|
||
// of a try...except clause.
|
||
//
|
||
|
||
if (KeGetPreviousMode() != KernelMode) {
|
||
try {
|
||
ProbeForRead( ReadTimeout,
|
||
sizeof( LARGE_INTEGER ),
|
||
sizeof( ULONG ) );
|
||
mailslotCreateParameters.ReadTimeout = *ReadTimeout;
|
||
} except(EXCEPTION_EXECUTE_HANDLER) {
|
||
|
||
//
|
||
// Something went awry attempting to access the parameter.
|
||
// Get the reason for the error and return it as the status
|
||
// value from this service.
|
||
//
|
||
|
||
return GetExceptionCode();
|
||
}
|
||
} else {
|
||
|
||
//
|
||
// The caller's mode was kernel so simply store the parameter.
|
||
//
|
||
|
||
mailslotCreateParameters.ReadTimeout = *ReadTimeout;
|
||
}
|
||
} else {
|
||
|
||
//
|
||
// Indicate that no default timeout period was specified.
|
||
//
|
||
|
||
mailslotCreateParameters.TimeoutSpecified = FALSE;
|
||
}
|
||
|
||
//
|
||
// Store the mailslot-specific parameters in the structure for use
|
||
// in the call to the common create file routine.
|
||
//
|
||
|
||
mailslotCreateParameters.MailslotQuota = MailslotQuota;
|
||
mailslotCreateParameters.MaximumMessageSize = MaximumMessageSize;
|
||
|
||
//
|
||
// Simply perform the remainder of the service by allowing the common
|
||
// file creation code to do the work.
|
||
//
|
||
|
||
return IoCreateFile( FileHandle,
|
||
DesiredAccess,
|
||
ObjectAttributes,
|
||
IoStatusBlock,
|
||
(PLARGE_INTEGER) NULL,
|
||
0L,
|
||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||
FILE_CREATE,
|
||
CreateOptions,
|
||
(PVOID) NULL,
|
||
0L,
|
||
CreateFileTypeMailslot,
|
||
&mailslotCreateParameters,
|
||
0 );
|
||
}
|