📄 1394api.c
字号:
SetLocalHostProps3 = (PSET_LOCAL_HOST_PROPS3)Information;
TRACE(TL_TRACE, ("fulFlags = 0x%x\n", SetLocalHostProps3->fulFlags));
TRACE(TL_TRACE, ("hCromData = 0x%x\n", SetLocalHostProps3->hCromData));
TRACE(TL_TRACE, ("nLength = 0x%x\n", SetLocalHostProps3->nLength));
// since we need to create a mdl, we'll create another setlocalhostprops3
// and pass that down to the bus driver
R0_SetLocalHostProps3 = ExAllocatePool(NonPagedPool, sizeof(SET_LOCAL_HOST_PROPS3));
if (!R0_SetLocalHostProps3) {
TRACE(TL_ERROR, ("Failed to allocate R0_SetLocalHostProps3!\n"));
if (pIrb)
ExFreePool(pIrb);
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_SetLocalHostProperties;
} // if
TRACE(TL_TRACE, ("R0_SetLocalHostProps3 = 0x%x\n", R0_SetLocalHostProps3));
// copy over the contents...
RtlCopyMemory( R0_SetLocalHostProps3,
SetLocalHostProps3,
sizeof(SET_LOCAL_HOST_PROPS3)
);
// branch, depending if we are adding or removing
if (R0_SetLocalHostProps3->fulFlags == SLHP_FLAG_ADD_CROM_DATA) {
// we are adding an entry. let's get our crom data struct...
CromData = ExAllocatePool(NonPagedPool, sizeof(CROM_DATA));
if (!CromData) {
TRACE(TL_ERROR, ("Failed to allocate CromData!\n"));
if (pIrb)
ExFreePool(pIrb);
if (R0_SetLocalHostProps3)
ExFreePool(R0_SetLocalHostProps3);
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_SetLocalHostProperties;
}
// let's allocate our buffer...
CromData->Buffer = ExAllocatePool(NonPagedPool, R0_SetLocalHostProps3->nLength);
TRACE(TL_TRACE, ("CromData->Buffer = 0x%x\n", CromData->Buffer));
if (!CromData->Buffer) {
TRACE(TL_ERROR, ("Failed to allocate CromData->Buffer!\n"));
if (pIrb)
ExFreePool(pIrb);
if (R0_SetLocalHostProps3)
ExFreePool(R0_SetLocalHostProps3);
if (CromData)
ExFreePool(CromData);
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_SetLocalHostProperties;
}
// copy over contents (mdl == ring 3 buffer)
RtlCopyMemory(CromData->Buffer, &SetLocalHostProps3->Mdl, SetLocalHostProps3->nLength);
R0_SetLocalHostProps3->Mdl = IoAllocateMdl (CromData->Buffer,
R0_SetLocalHostProps3->nLength,
FALSE,
FALSE,
NULL);
MmBuildMdlForNonPagedPool(R0_SetLocalHostProps3->Mdl);
TRACE(TL_TRACE, ("Mdl = 0x%x\n", R0_SetLocalHostProps3->Mdl));
}
else if (SetLocalHostProps3->fulFlags == SLHP_FLAG_REMOVE_CROM_DATA) {
TRACE(TL_TRACE, ("hCromData = 0x%x\n", R0_SetLocalHostProps3->hCromData));
}
pIrb->u.SetLocalHostProperties.Information = (PVOID)R0_SetLocalHostProps3;
}
//
// 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 (nLevel == SET_LOCAL_HOST_PROPERTIES_MODIFY_CROM) {
if (R0_SetLocalHostProps3->fulFlags == SLHP_FLAG_ADD_CROM_DATA) {
if (R0_SetLocalHostProps3->Mdl)
ExFreePool(R0_SetLocalHostProps3->Mdl);
if (CromData->Buffer)
ExFreePool(CromData->Buffer);
if (CromData)
ExFreePool(CromData);
}
if (R0_SetLocalHostProps3)
ExFreePool(R0_SetLocalHostProps3);
}
TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x\n", ntStatus));
}
else {
if (nLevel == SET_LOCAL_HOST_PROPERTIES_MODIFY_CROM) {
KIRQL Irql;
// branch, depending if we are adding or removing
if (R0_SetLocalHostProps3->fulFlags == SLHP_FLAG_ADD_CROM_DATA) {
PSET_LOCAL_HOST_PROPS3 SetLocalHostProps3;
SetLocalHostProps3 = Information;
SetLocalHostProps3->hCromData = R0_SetLocalHostProps3->hCromData;
TRACE(TL_TRACE, ("hCromData = 0x%x\n", SetLocalHostProps3->hCromData));
if (CromData) {
CromData->hCromData = SetLocalHostProps3->hCromData;
CromData->pMdl = R0_SetLocalHostProps3->Mdl;
// need to add to our list...
KeAcquireSpinLock(&deviceExtension->CromSpinLock, &Irql);
InsertHeadList(&deviceExtension->CromData, &CromData->CromList);
KeReleaseSpinLock(&deviceExtension->CromSpinLock, Irql);
}
}
else if (R0_SetLocalHostProps3->fulFlags == SLHP_FLAG_REMOVE_CROM_DATA) {
// have to find our struct...
KeAcquireSpinLock(&deviceExtension->CromSpinLock, &Irql);
CromData = (PCROM_DATA) deviceExtension->CromData.Flink;
while (CromData) {
if (CromData->hCromData == R0_SetLocalHostProps3->hCromData) {
RemoveEntryList(&CromData->CromList);
break;
}
else if (CromData->CromList.Flink == &deviceExtension->CromData) {
CromData = NULL;
break;
}
else
CromData = (PCROM_DATA)CromData->CromList.Flink;
}
KeReleaseSpinLock(&deviceExtension->CromSpinLock, Irql);
if (CromData) {
if (CromData->Buffer)
ExFreePool(CromData->Buffer);
if (CromData->pMdl)
ExFreePool(CromData->pMdl);
ExFreePool(CromData);
}
}
if (R0_SetLocalHostProps3)
ExFreePool(R0_SetLocalHostProps3);
}
}
Exit_SetLocalHostProperties:
if (pIrb)
{
ExFreePool(pIrb);
}
if (allocNewIrp)
{
Irp->IoStatus = ioStatus;
}
EXIT("t1394_SetLocalHostProperties", ntStatus);
return(ntStatus);
} // t1394_SetLocalHostProperties
VOID
t1394_BusResetRoutine(
IN PVOID Context
)
{
PDEVICE_OBJECT DeviceObject = Context;
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
PIO_WORKITEM ioWorkItem = NULL;
NTSTATUS ntStatus = STATUS_SUCCESS;
PBUS_RESET_IRP BusResetIrp = NULL;
PDRIVER_CANCEL prevCancel = NULL;
KIRQL Irql;
ENTER("t1394_BusResetRoutine");
TRACE(TL_TRACE, ("Context = 0x%x\n", Context));
// make sure our device is still around
if (deviceExtension->bShutdown)
{
goto Exit_BusResetRoutine;
}
// need to update the generation count, queue a work item to do that
ioWorkItem = IoAllocateWorkItem (DeviceObject);
if (!ioWorkItem)
{
TRACE(TL_ERROR, ("t1394_BusResetRoutine: Failed to allocate work item!\n"));
goto Exit_BusResetRoutine;
}
IoQueueWorkItem (ioWorkItem,
t1394_UpdateGenerationCount,
DelayedWorkQueue,
ioWorkItem);
// if we have any bus reset notify irps, then nows the time to complete them
KeAcquireSpinLock(&deviceExtension->ResetSpinLock, &Irql);
while (!IsListEmpty(&deviceExtension->BusResetIrps))
{
// get the irp off of the list
BusResetIrp = (PBUS_RESET_IRP)RemoveHeadList(&deviceExtension->BusResetIrps);
TRACE(TL_TRACE, ("BusResetIrp = 0x%x\n", BusResetIrp));
// make this irp non-cancelable...
prevCancel = IoSetCancelRoutine(BusResetIrp->Irp, NULL);
TRACE(TL_TRACE, ("Completing BusResetIrp->Irp = 0x%x\n", BusResetIrp->Irp));
// and complete it...
BusResetIrp->Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(BusResetIrp->Irp, IO_NO_INCREMENT);
ExFreePool(BusResetIrp);
}
KeReleaseSpinLock(&deviceExtension->ResetSpinLock, Irql);
Exit_BusResetRoutine:
EXIT("t1394_BusResetRoutine", ntStatus);
} // t1394_BusResetRoutine
NTSTATUS
t1394_BusResetNotification(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN ULONG fulFlags
)
{
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_BusResetNotification");
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_BusResetNotification;
} // 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_BusResetNotification;
}
allocNewIrp = TRUE;
}
RtlZeroMemory (pIrb, sizeof (IRB));
pIrb->FunctionNumber = REQUEST_BUS_RESET_NOTIFICATION;
pIrb->Flags = 0;
pIrb->u.BusResetNotification.fulFlags = fulFlags;
pIrb->u.BusResetNotification.ResetRoutine = t1394_BusResetRoutine;
pIrb->u.BusResetNotification.ResetContext = DeviceObject;
//
// 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_BusResetNotification:
if (pIrb)
{
ExFreePool(pIrb);
}
if (allocNewIrp)
{
Irp->IoStatus = ioStatus;
}
EXIT("t1394_BusResetNotification", ntStatus);
return(ntStatus);
} // t1394_BusResetNotification
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -