📄 1394api.c
字号:
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
1394api.c
Abstract
Author:
Peter Binder (pbinder) 5/07/98
Revision History:
Date Who What
-------- --------- ------------------------------------------------------------
5/07/98 pbinder birth
--*/
// todo:
// t1394_Control
// t1394_GetMaxSpeedBetweenDevices
// t1394_GetConfigurationInformation
// t1394_SendPhyConfigurationPacket
// t1394_GetSpeedTopologyMaps
// t1394_BusResetNotification
NTSTATUS
t1394_GetLocalHostInformation(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN ULONG nLevel,
IN OUT PULONG UserStatus,
IN OUT PVOID Information
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
PIRB pIrb = NULL;
GET_LOCAL_HOST_INFO7 LocalHostInfo7;
GET_LOCAL_HOST_INFO6 LocalHostInfo6;
GET_LOCAL_HOST_INFO5 LocalHostInfo5;
PIRP newIrp = NULL;
BOOLEAN allocNewIrp = FALSE;
KEVENT Event;
IO_STATUS_BLOCK ioStatus;
ENTER("t1394_GetLocalHostInformation");
TRACE(TL_TRACE, ("nLevel = 0x%x\n", nLevel));
TRACE(TL_TRACE, ("Information = 0x%x\n", Information));
// allocate irb
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
if (!pIrb) {
TRACE(TL_ERROR, ("Failed to allocate pIrb!\n"));
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_GetLocalHostInformation;
} // if
//
// If this is a UserMode request create a newIrp so that the request
// will be issued from KernelMode
//
if (Irp->RequestorMode == UserMode) {
newIrp = IoBuildDeviceIoControlRequest (IOCTL_1394_CLASS, deviceExtension->StackDeviceObject,
NULL, 0, NULL, 0, TRUE, &Event, &ioStatus);
if (!newIrp) {
TRACE(TL_ERROR, ("Failed to allocate newIrp!\n"));
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_GetLocalHostInformation;
}
allocNewIrp = TRUE;
}
RtlZeroMemory (pIrb, sizeof (IRB));
pIrb->FunctionNumber = REQUEST_GET_LOCAL_HOST_INFO;
pIrb->Flags = 0;
pIrb->u.GetLocalHostInformation.nLevel = nLevel;
if (nLevel == 7) {
// need to ensure that no one passed us an GET_LOCAL_HOST_INFO7 structure that just
// piggy backed on the GET_LOCAL_HOST_INFORMATION struct, if they did this will cause
// data misalignment errors in 64 bit because 1394bus will be expecting that structure to
// be aligned correctly
RtlCopyMemory (&LocalHostInfo7, Information, sizeof (GET_LOCAL_HOST_INFO7));
pIrb->u.GetLocalHostInformation.Information = &LocalHostInfo7;
TRACE(TL_TRACE, ("HostDmaCapabilities = 0x%p\n", LocalHostInfo7.HostDmaCapabilities));
TRACE(TL_TRACE, ("MaxDmaBufferSize High = 0x%x\n", LocalHostInfo7.MaxDmaBufferSize.HighPart));
TRACE(TL_TRACE, ("MaxDmaBufferSize Low = 0x%x\n", LocalHostInfo7.MaxDmaBufferSize.LowPart));
}
else if (nLevel == 6) {
LocalHostInfo6.CsrBaseAddress.Off_High = ((PGET_LOCAL_HOST_INFO6)Information)->CsrBaseAddress.Off_High;
LocalHostInfo6.CsrBaseAddress.Off_Low = ((PGET_LOCAL_HOST_INFO6)Information)->CsrBaseAddress.Off_Low;
LocalHostInfo6.CsrDataLength = ((PGET_LOCAL_HOST_INFO6)Information)->CsrDataLength;
// Pointer math needed to correct size differential between data structures on WIN64 only
// LocalHostInfo6.CsrDataBuffer is UCHAR @ 4 bytes, Information->CsrDataBuffer is a PVIOD @ 8 bytes
LocalHostInfo6.CsrDataBuffer = ((PCHAR)&(((PGET_LOCAL_HOST_INFO6)Information)->CsrDataLength)) + sizeof (ULONG);
pIrb->u.GetLocalHostInformation.Information = &LocalHostInfo6;
TRACE(TL_TRACE, ("CsrBaseAddress.Off_High = 0x%x\n", LocalHostInfo6.CsrBaseAddress.Off_High));
TRACE(TL_TRACE, ("CsrBaseAddress.Off_Low = 0x%x\n", LocalHostInfo6.CsrBaseAddress.Off_Low));
TRACE(TL_TRACE, ("CsrDataLength = 0x%x\n", LocalHostInfo6.CsrDataLength));
TRACE(TL_TRACE, ("CsrDataBuffer = 0x%p\n", LocalHostInfo6.CsrDataBuffer));
}
else if (nLevel == 5)
{
// need to ensure that no one passed us an GET_LOCAL_HOST_INFO5 structure that just
// piggy backed on the GET_LOCAL_HOST_INFORMATION struct, if they did this will cause
// data misalignment errors in 64 bit because 1394bus will be expecting that structure to
// be aligned correctly
RtlCopyMemory (&LocalHostInfo5, Information, sizeof (GET_LOCAL_HOST_INFO5));
pIrb->u.GetLocalHostInformation.Information = &LocalHostInfo5;
TRACE(TL_TRACE, ("ConfigRom = 0x%p\n", LocalHostInfo5.ConfigRom));
TRACE(TL_TRACE, ("ConfigRomLength = 0x%x\n", LocalHostInfo5.ConfigRomLength));
}
else {
pIrb->u.GetLocalHostInformation.Information = Information;
}
//
// If we allocated this irp, submit it asynchronously and wait for its
// completion event to be signaled. Otherwise submit it synchronously
//
if (allocNewIrp) {
KeInitializeEvent (&Event, NotificationEvent, FALSE);
ntStatus = t1394_SubmitIrpAsync (deviceExtension->StackDeviceObject, newIrp, pIrb);
if (ntStatus == STATUS_PENDING) {
KeWaitForSingleObject (&Event, Executive, KernelMode, FALSE, NULL);
ntStatus = ioStatus.Status;
}
}
else {
ntStatus = t1394_SubmitIrpSynch(deviceExtension->StackDeviceObject, Irp, pIrb);
}
if (!NT_SUCCESS(ntStatus)) {
if (ntStatus == STATUS_INVALID_BUFFER_SIZE) {
// we have to set status=success, otherwise, we don't get
// the size value passed up to ring 3.
ntStatus = STATUS_SUCCESS;
*UserStatus = 122;
TRACE(TL_WARNING, ("Invalid Buffer Size. nLevel = 0x%x\n", nLevel));
// see if it's a config rom request or a csr request
if (nLevel == 5) {
// it is, lets print out the size
TRACE(TL_TRACE, ("ConfigRomLength = 0x%x\n", LocalHostInfo5.ConfigRomLength));
// neet to set this in the information struct we were passed down
RtlCopyMemory(Information, &LocalHostInfo5, sizeof (GET_LOCAL_HOST_INFO5));
}
else if (nLevel == 6) {
// csr, print out size
TRACE(TL_TRACE, ("CsrDataLength needed = 0x%x\n", LocalHostInfo6.CsrDataLength));
// need to set this in the information struct we were passed down
((PGET_LOCAL_HOST_INFO6)Information)->CsrDataLength = LocalHostInfo6.CsrDataLength;
}
else if (nLevel == 7) {
// copy the results of the struct passed down
RtlCopyMemory(Information, &LocalHostInfo7, sizeof (GET_LOCAL_HOST_INFO7));
}
}
else {
TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x\n", ntStatus));
}
}
else {
*UserStatus = 0;
if (nLevel == 1) {
PGET_LOCAL_HOST_INFO1 LocalHostInfo1;
LocalHostInfo1 = (PGET_LOCAL_HOST_INFO1)Information;
TRACE(TL_TRACE, ("UniqueId.LowPart = 0x%x\n", LocalHostInfo1->UniqueId.LowPart));
TRACE(TL_TRACE, ("UniqueId.HighPart = 0x%x\n", LocalHostInfo1->UniqueId.HighPart));
}
else if (nLevel == 2) {
PGET_LOCAL_HOST_INFO2 LocalHostInfo2;
LocalHostInfo2 = (PGET_LOCAL_HOST_INFO2)Information;
TRACE(TL_TRACE, ("HostCapabilities = 0x%x\n", LocalHostInfo2->HostCapabilities));
TRACE(TL_TRACE, ("MaxAsyncReadRequest = 0x%x\n", LocalHostInfo2->MaxAsyncReadRequest));
TRACE(TL_TRACE, ("MaxAsyncWriteRequest = 0x%x\n", LocalHostInfo2->MaxAsyncWriteRequest));
}
else if (nLevel == 3) {
PGET_LOCAL_HOST_INFO3 LocalHostInfo3;
LocalHostInfo3 = (PGET_LOCAL_HOST_INFO3)Information;
TRACE(TL_TRACE, ("deciWattsSupplied = 0x%x\n", LocalHostInfo3->deciWattsSupplied));
TRACE(TL_TRACE, ("Voltage = 0x%x\n", LocalHostInfo3->Voltage));
}
else if (nLevel == 4) {
PGET_LOCAL_HOST_INFO4 LocalHostInfo4;
LocalHostInfo4 = (PGET_LOCAL_HOST_INFO4)Information;
TRACE(TL_TRACE, ("Context = 0x%x\n", LocalHostInfo4->Context));
}
else if (nLevel == 5) {
PGET_LOCAL_HOST_INFO5 pLocalHostInfo5;
pLocalHostInfo5 = (PGET_LOCAL_HOST_INFO5)Information;
TRACE(TL_TRACE, ("ConfigRomLength = 0x%x\n", pLocalHostInfo5->ConfigRomLength));
// IDEAIDEA: add some debug spew for whatever we are getting...
}
else if (nLevel == 6) {
// IDEAIDEA: add some debug spew for whatever we are getting...
}
else if (nLevel == 7) {
// need to copy the results back into the original address space passed in
TRACE(TL_TRACE, ("HostDmaCapabilities = 0x%x\n", LocalHostInfo7.HostDmaCapabilities));
TRACE(TL_TRACE, ("MaxDmaBufferSize Low = 0x%x\n", LocalHostInfo7.MaxDmaBufferSize.LowPart));
TRACE(TL_TRACE, ("MaxDmaBufferSize High = 0x%x\n", LocalHostInfo7.MaxDmaBufferSize.HighPart));
RtlCopyMemory(Information, &LocalHostInfo7, sizeof (GET_LOCAL_HOST_INFO7));
}
else {
TRACE(TL_WARNING, ("Returned success on invalid nLevel = 0x%x\n", nLevel));
}
}
Exit_GetLocalHostInformation:
if (pIrb)
{
ExFreePool(pIrb);
}
if (allocNewIrp)
{
Irp->IoStatus = ioStatus;
}
EXIT("t1394_GetLocalHostInformation", ntStatus);
return(ntStatus);
} // t1394_GetLocalHostInformation
NTSTATUS
t1394_Get1394AddressFromDeviceObject(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN ULONG fulFlags,
OUT PNODE_ADDRESS pNodeAddress
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
PIRB pIrb = NULL;
PIRP newIrp = NULL;
BOOLEAN allocNewIrp = FALSE;
KEVENT Event;
IO_STATUS_BLOCK ioStatus;
ENTER("t1394_Get1394AddressFromDeviceObject");
TRACE(TL_TRACE, ("fulFlags = 0x%x\n", fulFlags));
// allocate irb
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
if (!pIrb) {
TRACE(TL_ERROR, ("Failed to allocate pIrb!\n"));
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_Get1394AddressFromDeviceObject;
} // if
//
// If this is a UserMode request create a newIrp so that the request
// will be issued from KernelMode
//
if (Irp->RequestorMode == UserMode) {
newIrp = IoBuildDeviceIoControlRequest (IOCTL_1394_CLASS, deviceExtension->StackDeviceObject,
NULL, 0, NULL, 0, TRUE, &Event, &ioStatus);
if (!newIrp) {
TRACE(TL_ERROR, ("Failed to allocate newIrp!\n"));
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_Get1394AddressFromDeviceObject;
}
allocNewIrp = TRUE;
}
RtlZeroMemory (pIrb, sizeof (IRB));
pIrb->FunctionNumber = REQUEST_GET_ADDR_FROM_DEVICE_OBJECT;
pIrb->Flags = 0;
pIrb->u.Get1394AddressFromDeviceObject.fulFlags = fulFlags;
//
// If we allocated this irp, submit it asynchronously and wait for its
// completion event to be signaled. Otherwise submit it synchronously
//
if (allocNewIrp) {
KeInitializeEvent (&Event, NotificationEvent, FALSE);
ntStatus = t1394_SubmitIrpAsync (deviceExtension->StackDeviceObject, newIrp, pIrb);
if (ntStatus == STATUS_PENDING) {
KeWaitForSingleObject (&Event, Executive, KernelMode, FALSE, NULL);
ntStatus = ioStatus.Status;
}
}
else {
ntStatus = t1394_SubmitIrpSynch(deviceExtension->StackDeviceObject, Irp, pIrb);
}
if (NT_SUCCESS(ntStatus)) {
*pNodeAddress = pIrb->u.Get1394AddressFromDeviceObject.NodeAddress;
TRACE(TL_TRACE, ("NodeAddres.NA_Node_Number = 0x%x\n", pNodeAddress->NA_Node_Number));
TRACE(TL_TRACE, ("NodeAddres.NA_Bus_Number = 0x%x\n", pNodeAddress->NA_Bus_Number));
}
else {
TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x\n", ntStatus));
}
Exit_Get1394AddressFromDeviceObject:
if(pIrb)
{
ExFreePool(pIrb);
}
if (allocNewIrp)
{
Irp->IoStatus = ioStatus;
}
EXIT("t1394_Get1394AddressFromDeviceObject", ntStatus);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -