Leaked source code of windows server 2003
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.
 
 
 
 
 
 

153 lines
3.9 KiB

/*++
Copyright (c) 1998-2000 Microsoft Corporation
Module Name :
parport.cpp
Abstract:
Parallel port Device object handles one redirected parallel port
Revision History:
--*/
#include "precomp.hxx"
#define TRC_FILE "parport"
#include "trc.h"
DrParallelPort::DrParallelPort(SmartPtr<DrSession> &Session, ULONG DeviceType, ULONG DeviceId,
PUCHAR PreferredDosName) : DrPrinterPort(Session, DeviceType, DeviceId, PreferredDosName)
{
BEGIN_FN("DrParallelPort::DrParallelPort");
SetClassName("DrParallelPort");
_PortType = FILE_DEVICE_PARALLEL_PORT;
}
BOOL DrParallelPort::ShouldCreatePrinter()
{
BEGIN_FN("DrParallelPort::ShouldCreatePrinter");
return FALSE;
}
BOOL DrParallelPort::ShouldCreatePort()
{
BEGIN_FN("DrParallelPort::ShouldCreatePort");
return !_Session->DisableLptPortMapping();
}
NTSTATUS DrParallelPort::Initialize(PRDPDR_DEVICE_ANNOUNCE DeviceAnnounce, ULONG Length)
{
NTSTATUS Status;
BEGIN_FN("DrParallelPort::Initialize");
if (ShouldCreatePort()) {
Status = DrPrinterPort::Initialize(DeviceAnnounce, Length);
if (NT_SUCCESS(Status) && _Session->GetClientCapabilitySet().PortCap.version > 0) {
Status = CreateLptPort(DeviceAnnounce);
}
}
else {
Status = STATUS_SUCCESS;
}
return Status;
}
NTSTATUS DrParallelPort::CreateLptPort(PRDPDR_DEVICE_ANNOUNCE devAnnounceMsg)
{
NTSTATUS Status;
UNICODE_STRING PortName;
WCHAR PortNameBuff[PREFERRED_DOS_NAME_SIZE];
USHORT OemCodePage, AnsiCodePage;
NTSTATUS status;
INT len, comLen;
ULONG portAnnounceEventReqSize;
PRDPDR_PORTDEVICE_SUB portAnnounceEvent;
BEGIN_FN("DrParallelPort::CreateLptPort");
//
// Convert the LPT name
//
PortName.MaximumLength = sizeof(PortNameBuff);
PortName.Length = 0;
PortName.Buffer = &PortNameBuff[0];
memset(&PortNameBuff, 0, sizeof(PortNameBuff));
comLen = strlen((char *)_PreferredDosName);
RtlGetDefaultCodePage(&AnsiCodePage, &OemCodePage);
len = ConvertToAndFromWideChar(AnsiCodePage, PortName.Buffer,
PortName.MaximumLength, (char *)_PreferredDosName,
comLen, TRUE);
if (len != -1) {
//
// We need just the LPTx portion for later...
//
PortName.Length = (USHORT)len;
PortName.Buffer[len/sizeof(WCHAR)] = L'\0';
} else {
TRC_ERR((TB, "Error converting comName"));
Status = STATUS_UNSUCCESSFUL;
goto CleanUpAndReturn;
}
//
// Allocate the port device announce buffer.
//
Status = CreatePortAnnounceEvent(devAnnounceMsg, NULL, 0, L"",
&portAnnounceEventReqSize);
ASSERT(Status == STATUS_BUFFER_TOO_SMALL);
if (Status != STATUS_BUFFER_TOO_SMALL) {
goto CleanUpAndReturn;
}
portAnnounceEvent = (PRDPDR_PORTDEVICE_SUB)new(NonPagedPool)
BYTE[portAnnounceEventReqSize];
if (portAnnounceEvent == NULL) {
TRC_ERR((TB, "Unable to allocate portAnnounceEvent"));
Status = STATUS_NO_MEMORY;
goto CleanUpAndReturn;
}
//
// Create the port anounce message.
//
Status = CreatePortAnnounceEvent(devAnnounceMsg, portAnnounceEvent,
portAnnounceEventReqSize, PortName.Buffer, NULL);
if (Status != STATUS_SUCCESS) {
delete portAnnounceEvent;
#if DBG
portAnnounceEvent = NULL;
#endif
goto CleanUpAndReturn;
}
//
// Dispatch the event to the associated session.
//
Status = RDPDYN_DispatchNewDevMgmtEvent(
portAnnounceEvent,
_Session->GetSessionId(),
RDPDREVT_PORTANNOUNCE,
NULL
);
CleanUpAndReturn:
return Status;
}