154 lines
3.9 KiB
C++
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;
|
|
}
|
|
|