287 lines
6.6 KiB
C
287 lines
6.6 KiB
C
//+-------------------------------------------------------------------------
|
||
//
|
||
// Microsoft Windows
|
||
//
|
||
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
||
//
|
||
// File: exports.c
|
||
//
|
||
//--------------------------------------------------------------------------
|
||
|
||
//
|
||
// This file contains the functions exported in response to IOCTL_INTERNAL_PARCLASS_CONNECT
|
||
//
|
||
|
||
#include "pch.h"
|
||
|
||
USHORT
|
||
ParExportedDetermineIeeeModes(
|
||
IN PPDO_EXTENSION Extension
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Called by filter drivers to find out what Ieee Modes there Device Supports.
|
||
|
||
Arguments:
|
||
|
||
Extension - Device Extension
|
||
|
||
Return Value:
|
||
|
||
STATUS_SUCCESS if successful.
|
||
|
||
--*/
|
||
{
|
||
Extension->BadProtocolModes = 0;
|
||
IeeeDetermineSupportedProtocols(Extension);
|
||
return Extension->ProtocolModesSupported;
|
||
}
|
||
|
||
NTSTATUS
|
||
ParExportedIeeeFwdToRevMode(
|
||
IN PPDO_EXTENSION Extension
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Called by filter drivers to put there device into reverse Ieee Mode.
|
||
The Mode is determined by what was passed into the function
|
||
ParExportedNegotiateIeeeMode() as the Reverse Protocol with the
|
||
ModeMaskRev.
|
||
|
||
Arguments:
|
||
|
||
Extension - Device Extension
|
||
|
||
Return Value:
|
||
|
||
STATUS_SUCCESS if successful.
|
||
|
||
--*/
|
||
{
|
||
return ( ParForwardToReverse( Extension ) );
|
||
}
|
||
|
||
NTSTATUS
|
||
ParExportedIeeeRevToFwdMode(
|
||
IN PPDO_EXTENSION Extension
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Called by filter drivers to put there device into forward Ieee Mode.
|
||
The Mode is determined by what was passed into the function
|
||
ParExportedNegotiateIeeeMode() as the Forward Protocol with the
|
||
ModeMaskFwd.
|
||
|
||
Arguments:
|
||
|
||
Extension - Device Extension
|
||
|
||
Return Value:
|
||
|
||
STATUS_SUCCESS if successful.
|
||
|
||
--*/
|
||
{
|
||
return ( ParReverseToForward( Extension ) );
|
||
}
|
||
|
||
NTSTATUS
|
||
ParExportedNegotiateIeeeMode(
|
||
IN PPDO_EXTENSION Extension,
|
||
IN USHORT ModeMaskFwd,
|
||
IN USHORT ModeMaskRev,
|
||
IN PARALLEL_SAFETY ModeSafety,
|
||
IN BOOLEAN IsForward
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Called by filter drivers to negotiate an IEEE mode.
|
||
|
||
Arguments:
|
||
|
||
Extension - Device Extension
|
||
|
||
Extensibility - IEEE 1284 Extensibility
|
||
|
||
Return Value:
|
||
|
||
STATUS_SUCCESS if successful.
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS Status = STATUS_SUCCESS;
|
||
|
||
if (Extension->Connected) {
|
||
DD((PCE)Extension,DDE,"ParExportedNegotiateIeeeMode - FAIL - already connected\n");
|
||
return STATUS_DEVICE_PROTOCOL_ERROR;
|
||
}
|
||
|
||
if (ModeSafety == UNSAFE_MODE) {
|
||
|
||
// Checking to see if we are doing forward compatability and reverse Nibble or Byte
|
||
if ( (ModeMaskFwd & CENTRONICS) || (ModeMaskFwd & IEEE_COMPATIBILITY) ) {
|
||
|
||
if ( !((ModeMaskRev & NIBBLE) || (ModeMaskRev & CHANNEL_NIBBLE) || (ModeMaskRev & BYTE_BIDIR)) ) {
|
||
DD((PCE)Extension,DDE,"ParExportedNegotiateIeeeMode - FAIL - invalid modes\n");
|
||
return STATUS_UNSUCCESSFUL;
|
||
}
|
||
|
||
} else {
|
||
|
||
// Unsafe mode is only possible if the Fwd and Rev PCTLs the same if other than above.
|
||
if (ModeMaskFwd != ModeMaskRev) {
|
||
DD((PCE)Extension,DDE,"ParExportedNegotiateIeeeMode - FAIL - Fwd and Rev modes do not match\n");
|
||
return STATUS_UNSUCCESSFUL;
|
||
}
|
||
|
||
}
|
||
// RMT - Need to fill in....
|
||
// Todo....
|
||
// Mark in the extension
|
||
Extension->ModeSafety = ModeSafety;
|
||
Status = IeeeNegotiateMode(Extension, ModeMaskRev, ModeMaskFwd);
|
||
|
||
} else {
|
||
|
||
Extension->ModeSafety = ModeSafety;
|
||
Status = IeeeNegotiateMode(Extension, ModeMaskRev, ModeMaskFwd);
|
||
|
||
}
|
||
|
||
if (IsForward) {
|
||
|
||
if (afpForward[Extension->IdxForwardProtocol].fnConnect) {
|
||
Status = afpForward[Extension->IdxForwardProtocol].fnConnect(Extension, FALSE);
|
||
}
|
||
|
||
} else {
|
||
|
||
if (arpReverse[Extension->IdxReverseProtocol].fnConnect) {
|
||
Status = arpReverse[Extension->IdxReverseProtocol].fnConnect(Extension, FALSE);
|
||
}
|
||
|
||
}
|
||
|
||
return Status;
|
||
}
|
||
|
||
NTSTATUS
|
||
ParExportedTerminateIeeeMode(
|
||
IN PPDO_EXTENSION Extension
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Called by filter drivers to terminate from an IEEE mode.
|
||
|
||
Arguments:
|
||
|
||
Extension - Device Extension
|
||
|
||
Return Value:
|
||
|
||
STATUS_SUCCESS if successful.
|
||
|
||
--*/
|
||
{
|
||
// Check the extension for UNSAFE_MODE
|
||
// and do the right thing
|
||
if ( Extension->ModeSafety == UNSAFE_MODE ) {
|
||
DD((PCE)Extension,DDT,"ParExportedTerminateIeeeMode in UNSAFE_MODE\n");
|
||
// Need to fill in....
|
||
// Todo....
|
||
// Mark in the extension
|
||
}
|
||
|
||
if (Extension->CurrentPhase == PHASE_REVERSE_IDLE || Extension->CurrentPhase == PHASE_REVERSE_XFER) {
|
||
if (arpReverse[Extension->IdxReverseProtocol].fnDisconnect) {
|
||
arpReverse[Extension->IdxReverseProtocol].fnDisconnect( Extension );
|
||
}
|
||
} else {
|
||
if (afpForward[Extension->IdxForwardProtocol].fnDisconnect) {
|
||
afpForward[Extension->IdxForwardProtocol].fnDisconnect( Extension );
|
||
}
|
||
}
|
||
|
||
Extension->ModeSafety = SAFE_MODE;
|
||
|
||
return STATUS_SUCCESS;
|
||
}
|
||
|
||
NTSTATUS
|
||
ParExportedParallelRead(
|
||
IN PPDO_EXTENSION Extension,
|
||
IN PVOID Buffer,
|
||
IN ULONG NumBytesToRead,
|
||
OUT PULONG NumBytesRead,
|
||
IN UCHAR Channel
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Called by filter drivers to terminate from a currently connected mode.
|
||
|
||
Arguments:
|
||
|
||
Extension - Device Extension
|
||
|
||
Return Value:
|
||
|
||
STATUS_SUCCESS if successful.
|
||
|
||
--*/
|
||
|
||
{
|
||
UNREFERENCED_PARAMETER( Channel );
|
||
|
||
return ParRead( Extension, Buffer, NumBytesToRead, NumBytesRead);
|
||
}
|
||
|
||
NTSTATUS
|
||
ParExportedParallelWrite(
|
||
IN PPDO_EXTENSION Extension,
|
||
OUT PVOID Buffer,
|
||
IN ULONG NumBytesToWrite,
|
||
OUT PULONG NumBytesWritten,
|
||
IN UCHAR Channel
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER( Channel );
|
||
return ParWrite( Extension, Buffer, NumBytesToWrite, NumBytesWritten);
|
||
}
|
||
|
||
NTSTATUS
|
||
ParExportedTrySelect(
|
||
IN PPDO_EXTENSION Extension,
|
||
IN PARALLEL_1284_COMMAND Command
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER( Extension );
|
||
UNREFERENCED_PARAMETER( Command );
|
||
return STATUS_UNSUCCESSFUL;
|
||
}
|
||
|
||
NTSTATUS
|
||
ParExportedDeSelect(
|
||
IN PPDO_EXTENSION Extension,
|
||
IN PARALLEL_1284_COMMAND Command
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER( Extension );
|
||
UNREFERENCED_PARAMETER( Command );
|
||
return STATUS_UNSUCCESSFUL;
|
||
}
|