2020-09-30 17:17:25 +02:00

154 lines
3.9 KiB
C++

/*++
Copyright (c) 2000 Microsoft Corporation
modem.cpp
Abstract:
Driver entry points for the XBox USB modem driver.
Revision History:
06-21-00 vadimg created
--*/
#include "precomp.h"
/***************************************************************************\
* Modem_IsConnected
*
\***************************************************************************/
BOOL Modem_IsConnected(VOID)
{
ASSERT_DISPATCH_LEVEL();
return (gDevice.pDevice != NULL);
}
/***************************************************************************\
* Modem_Create
*
\***************************************************************************/
BOOL Modem_Create(VOID)
{
ASSERT_DISPATCH_LEVEL();
if (!OpenEndpoints()) {
CloseEndpoints();
return FALSE;
}
ReadWorker();
return TRUE;
}
/***************************************************************************\
* Modem_Close
*
\***************************************************************************/
BOOL Modem_Close(VOID)
{
ASSERT_DISPATCH_LEVEL();
if (gRead.pevent != NULL) {
ObDereferenceObject(gRead.pevent);
gRead.pevent = NULL;
}
CloseEndpoints();
return TRUE;
}
/***************************************************************************\
* Modem_AddDevice
*
\***************************************************************************/
VOID Modem_AddDevice(IUsbDevice *pDevice, PVOID)
{
ASSERT_DISPATCH_LEVEL();
if (gDevice.pDevice == NULL) {
ConfigureDevice(pDevice);
} else {
pDevice->AddComplete(USBD_STATUS_UNSUPPORTED_DEVICE, NULL);
}
}
/***************************************************************************\
* CloseDefaultEndpoint
*
\***************************************************************************/
VOID CloseDefaultEndpoint(PURB purb, IUsbDevice *pDevice)
{
ASSERT_DISPATCH_LEVEL();
Modem_Close();
}
/***************************************************************************\
* Modem_RemoveDevice
*
\***************************************************************************/
VOID Modem_RemoveDevice(IUsbDevice *pDevice)
{
PURB purb;
ASSERT_DISPATCH_LEVEL();
gfRemoved = TRUE;
purb = &gUrb;
USB_BUILD_CLOSE_DEFAULT_ENDPOINT(
(PURB_CLOSE_ENDPOINT)purb,
(PURB_COMPLETE_PROC)CloseDefaultEndpoint,
(PVOID)pDevice);
pDevice->SubmitRequest(purb);
}
/***************************************************************************\
* DriverEntry
*
\***************************************************************************/
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT, IN PUNICODE_STRING)
{
gpMdl = IoAllocateMdl(&gMem, sizeof(gMem), FALSE, FALSE, NULL);
if (gpMdl == NULL) {
return STATUS_INSUFFICIENT_RESOURCES;
}
gpMdlRead = IoAllocateMdl(&gRead.buffer, MODEM_BUFFER_SIZE, FALSE, FALSE, NULL);
if (gpMdlRead == NULL) {
return STATUS_INSUFFICIENT_RESOURCES;
}
gDeviceDescription.ConnectorType = USBPNP_CONNECTOR_TYPE_DIRECT;
gDeviceDescription.ControlEndpointCount = 1;
gDeviceDescription.BulkEndpointCount = 2;
gDeviceDescription.InterruptEndpointCount = 1;
gDeviceDescription.IsochEndpointCount = 0;
gDeviceDescription.MaxBulkTDperTransfer = 2;
gDeviceDescription.MaxControlTDperTransfer = 30;
gDeviceDescription.NumNodes = 1;
gClassDescription.AddDevice = (PFNADD_USB_DEVICE)Modem_AddDevice;
gClassDescription.RemoveDevice = (PFNREMOVE_USB_DEVICE)Modem_RemoveDevice;
gClassDescription.ClassId.AsLong = USB_DEVICE_TYPE_MODEM;
gClassDescription.DeviceTypeCount = 1;
gClassDescription.DeviceTypes = &gDeviceDescription;
USBPNP_RegisterClassDriver(1, &gClassDescription);
return STATUS_SUCCESS;
}