📄 1394api.c
字号:
return(ntStatus);
} // t1394_Get1394AddressFromDeviceObject
NTSTATUS
t1394_Control(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
ENTER("t1394_Control");
ntStatus = STATUS_NOT_IMPLEMENTED;
EXIT("t1394_Control", ntStatus);
return(ntStatus);
} // t1394_Control
NTSTATUS
t1394_GetMaxSpeedBetweenDevices(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN ULONG fulFlags,
IN ULONG ulNumberOfDestinations,
IN PDEVICE_OBJECT hDestinationDeviceObjects[64],
OUT PULONG fulSpeed
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
PIRB pIrb = NULL;
ULONG i;
PIRP newIrp = NULL;
BOOLEAN allocNewIrp = FALSE;
KEVENT Event;
IO_STATUS_BLOCK ioStatus;
ENTER("t1394_GetMaxSpeedBetweenDevices");
TRACE(TL_TRACE, ("DeviceObject = 0x%x\n", DeviceObject));
TRACE(TL_TRACE, ("Irp = 0x%x\n", Irp));
TRACE(TL_TRACE, ("fulFlags = 0x%x\n", fulFlags));
TRACE(TL_TRACE, ("ulNumberOfDestinations = 0x%x\n", ulNumberOfDestinations));
for (i=0; i<ulNumberOfDestinations; i++) {
TRACE(TL_TRACE, ("hDestinationDeviceObjects[%d] = 0x%x\n", i, hDestinationDeviceObjects[i]));
}
// allocate irb
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
if (!pIrb) {
TRACE(TL_ERROR, ("Failed to allocate pIrb!\n"));
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_GetMaxSpeedBetweenDevices;
} // 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_GetMaxSpeedBetweenDevices;
}
allocNewIrp = TRUE;
}
RtlZeroMemory (pIrb, sizeof (IRB));
pIrb->FunctionNumber = REQUEST_GET_SPEED_BETWEEN_DEVICES;
pIrb->Flags = 0;
pIrb->u.GetMaxSpeedBetweenDevices.fulFlags = fulFlags;
pIrb->u.GetMaxSpeedBetweenDevices.ulNumberOfDestinations = ulNumberOfDestinations;
for (i=0; i<ulNumberOfDestinations; i++) {
pIrb->u.GetMaxSpeedBetweenDevices.hDestinationDeviceObjects[i] = hDestinationDeviceObjects[i];
}
//
// 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)) {
*fulSpeed = pIrb->u.GetMaxSpeedBetweenDevices.fulSpeed;
TRACE(TL_TRACE, ("fulSpeed = 0x%x\n", *fulSpeed));
}
else {
TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x\n", ntStatus));
}
Exit_GetMaxSpeedBetweenDevices:
if (pIrb)
{
ExFreePool(pIrb);
}
if (allocNewIrp)
{
Irp->IoStatus = ioStatus;
}
EXIT("t1394_GetMaxSpeedBetweenDevices", ntStatus);
return(ntStatus);
} // t1394_GetMaxSpeedBetweenDevices
NTSTATUS
t1394_SetDeviceXmitProperties(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN ULONG fulSpeed,
IN ULONG fulPriority
)
{
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_SetDeviceXmitProperties");
TRACE(TL_TRACE, ("fulSpeed = 0x%x\n", fulSpeed));
TRACE(TL_TRACE, ("fulPriority = 0x%x\n", fulPriority));
// allocate irb
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
if (!pIrb) {
TRACE(TL_ERROR, ("Failed to allocate pIrb!\n"));
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_SetDeviceXmitProperties;
} // 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_SetDeviceXmitProperties;
}
allocNewIrp = TRUE;
}
RtlZeroMemory (pIrb, sizeof (IRB));
pIrb->FunctionNumber = REQUEST_SET_DEVICE_XMIT_PROPERTIES;
pIrb->Flags = 0;
pIrb->u.SetDeviceXmitProperties.fulSpeed = fulSpeed;
pIrb->u.SetDeviceXmitProperties.fulPriority = fulPriority;
//
// 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)) {
TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x\n", ntStatus));
}
Exit_SetDeviceXmitProperties:
if(pIrb)
{
ExFreePool(pIrb);
}
if (allocNewIrp)
{
Irp->IoStatus = ioStatus;
}
EXIT("t1394_SetDeviceXmitProperties", ntStatus);
return(ntStatus);
} // t1394_SetDeviceXmitProperties
NTSTATUS
t1394_GetConfigurationInformation(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
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_GetConfigurationInformation");
/*
struct {
PCONFIG_ROM ConfigRom; // Pointer to config rom
ULONG UnitDirectoryBufferSize;
PVOID UnitDirectory; // Pointer to unit directory
IO_ADDRESS UnitDirectoryLocation; // Starting Location of Unit Directory
ULONG UnitDependentDirectoryBufferSize;
PVOID UnitDependentDirectory;
IO_ADDRESS UnitDependentDirectoryLocation;
ULONG VendorLeafBufferSize; // Size available to get vendor leafs
PTEXTUAL_LEAF VendorLeaf; // Pointer to vendor leafs
ULONG ModelLeafBufferSize; // Size available to get model leafs
PTEXTUAL_LEAF ModelLeaf; // Pointer to model leafs
} GetConfigurationInformation;
*/
return(STATUS_NOT_IMPLEMENTED);
// allocate irb
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
if (!pIrb) {
TRACE(TL_ERROR, ("Failed to allocate pIrb!\n"));
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_GetConfigurationInformation;
} // 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_GetConfigurationInformation;
}
allocNewIrp = TRUE;
}
RtlZeroMemory (pIrb, sizeof (IRB));
pIrb->FunctionNumber = REQUEST_GET_CONFIGURATION_INFO;
pIrb->Flags = 0;
//
// 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)) {
TRACE(TL_TRACE, ("ConfigRom->CR_Info = 0x%x\n",
pIrb->u.GetConfigurationInformation.ConfigRom->CR_Info));
TRACE(TL_TRACE, ("ConfigRom->CR_Signiture = 0x%x\n",
pIrb->u.GetConfigurationInformation.ConfigRom->CR_Signiture));
TRACE(TL_TRACE, ("ConfigRom->CR_BusInfoBlockCaps = 0x%x\n",
pIrb->u.GetConfigurationInformation.ConfigRom->CR_BusInfoBlockCaps));
TRACE(TL_TRACE, ("ConfigRom->CR_Node_UniqueID[0] = 0x%x\n",
pIrb->u.GetConfigurationInformation.ConfigRom->CR_Node_UniqueID[0]));
TRACE(TL_TRACE, ("ConfigRom->CR_Node_UniqueID[1] = 0x%x\n",
pIrb->u.GetConfigurationInformation.ConfigRom->CR_Node_UniqueID[1]));
TRACE(TL_TRACE, ("ConfigRom->CR_Root_Info = 0x%x\n",
pIrb->u.GetConfigurationInformation.ConfigRom->CR_Root_Info));
TRACE(TL_TRACE, ("UnitDirectoryBufferSize = 0x%x\n",
pIrb->u.GetConfigurationInformation.UnitDirectoryBufferSize));
TRACE(TL_TRACE, ("UnitDirectory = 0x%x\n", pIrb->u.GetConfigurationInformation.UnitDirectory));
TRACE(TL_TRACE, ("UnitDirectoryLocation.NA_Bus_Number = 0x%x\n",
pIrb->u.GetConfigurationInformation.UnitDirectoryLocation.IA_Destination_ID.NA_Bus_Number));
TRACE(TL_TRACE, ("UnitDirectoryLocation.NA_Node_Number = 0x%x\n",
pIrb->u.GetConfigurationInformation.UnitDirectoryLocation.IA_Destination_ID.NA_Node_Number));
TRACE(TL_TRACE, ("UnitDirectoryLocation.Off_High = 0x%x\n",
pIrb->u.GetConfigurationInformation.UnitDirectoryLocation.IA_Destination_Offset.Off_High));
TRACE(TL_TRACE, ("UnitDirectoryLocation.Off_Low = 0x%x\n",
pIrb->u.GetConfigurationInformation.UnitDirectoryLocation.IA_Destination_Offset.Off_Low));
TRACE(TL_TRACE, ("UnitDependentDirectoryBufferSize = 0x%x\n",
pIrb->u.GetConfigurationInformation.UnitDependentDirectoryBufferSize));
TRACE(TL_TRACE, ("UnitDependentDirectory = 0x%x\n",
pIrb->u.GetConfigurationInformation.UnitDependentDirectory));
TRACE(TL_TRACE, ("UnitDependentDirectoryLocation.NA_Bus_Number = 0x%x\n",
pIrb->u.GetConfigurationInformation.UnitDependentDirectoryLocation.IA_Destination_ID.NA_Bus_Number));
TRACE(TL_TRACE, ("UnitDependentDirectoryLocation.NA_Node_Number = 0x%x\n",
pIrb->u.GetConfigurationInformation.UnitDependentDirectoryLocation.IA_Destination_ID.NA_Node_Number));
TRACE(TL_TRACE, ("UnitDependentDirectoryLocation.Off_High = 0x%x\n",
pIrb->u.GetConfigurationInformation.UnitDependentDirectoryLocation.IA_Destination_Offset.Off_High));
TRACE(TL_TRACE, ("UnitDependentDirectoryLocation.Off_Low = 0x%x\n",
pIrb->u.GetConfigurationInformation.UnitDependentDirectoryLocation.IA_Destination_Offset.Off_Low));
TRACE(TL_TRACE, ("VendorLeafBufferSize = 0x%x\n",
pIrb->u.GetConfigurationInformation.VendorLeafBufferSize));
TRACE(TL_TRACE, ("VendorLeaf->TL_CRC = 0x%x\n",
pIrb->u.GetConfigurationInformation.VendorLeaf->TL_CRC));
TRACE(TL_TRACE, ("VendorLeaf->TL_Length = 0x%x\n",
pIrb->u.GetConfigurationInformation.VendorLeaf->TL_Length));
TRACE(TL_TRACE, ("VendorLeaf->TL_Spec_Id = 0x%x\n",
pIrb->u.GetConfigurationInformation.VendorLeaf->TL_Spec_Id));
TRACE(TL_TRACE, ("VendorLeaf->TL_Language_Id = 0x%x\n",
pIrb->u.GetConfigurationInformation.VendorLeaf->TL_Language_Id));
TRACE(TL_TRACE, ("ModelLeafBufferSize = 0x%x\n",
pIrb->u.GetConfigurationInformation.ModelLeafBufferSize));
TRACE(TL_TRACE, ("ModelLeaf->TL_CRC = 0x%x\n",
pIrb->u.GetConfigurationInformation.ModelLeaf->TL_CRC));
TRACE(TL_TRACE, ("ModelLeaf->TL_Length = 0x%x\n",
pIrb->u.GetConfigurationInformation.ModelLeaf->TL_Length));
TRACE(TL_TRACE, ("ModelLeaf->TL_Spec_Id = 0x%x\n",
pIrb->u.GetConfigurationInformation.ModelLeaf->TL_Spec_Id));
TRACE(TL_TRACE, ("ModelLeaf->TL_Language_Id = 0x%x\n",
pIrb->u.GetConfigurationInformation.ModelLeaf->TL_Language_Id));
}
else {
TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x\n", ntStatus));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -