您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ ExFreePool函数代码示例

51自学网 2021-06-01 20:39:23
  C++
这篇教程C++ ExFreePool函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中ExFreePool函数的典型用法代码示例。如果您正苦于以下问题:C++ ExFreePool函数的具体用法?C++ ExFreePool怎么用?C++ ExFreePool使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了ExFreePool函数的30个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: TapeGetDriveParameters

//.........这里部分代码省略.........    cdb->MODE_SENSE.Pc = 0x0B;    buffer = ExAllocatePool(NonPagedPoolCacheAligned,        sizeof(NINE_TRACKSENSE_DATA));    if (!buffer) {        return STATUS_INSUFFICIENT_RESOURCES;    }    status = ScsiClassSendSrbSynchronous(DeviceObject,                                &srb,                                buffer,                                sizeof(NINE_TRACKSENSE_DATA),                                FALSE);    if (NT_SUCCESS(status)) {        Irp->IoStatus.Information = sizeof(TAPE_GET_DRIVE_PARAMETERS);        //        // Indicate support of following:        //        tapeGetDriveParams->ECC = FALSE;        tapeGetDriveParams->Compression = FALSE;        tapeGetDriveParams->DataPadding = FALSE;        tapeGetDriveParams->ReportSetmarks = FALSE;        tapeGetDriveParams->FeaturesLow =            TAPE_DRIVE_ERASE_SHORT |            TAPE_DRIVE_FIXED_BLOCK |            TAPE_DRIVE_VARIABLE_BLOCK |            TAPE_DRIVE_WRITE_PROTECT |            TAPE_DRIVE_GET_ABSOLUTE_BLK |            TAPE_DRIVE_GET_LOGICAL_BLK;        tapeGetDriveParams->FeaturesHigh =            TAPE_DRIVE_LOAD_UNLOAD |            TAPE_DRIVE_LOCK_UNLOCK |            TAPE_DRIVE_SET_BLOCK_SIZE |            TAPE_DRIVE_ABSOLUTE_BLK |            TAPE_DRIVE_ABS_BLK_IMMED |            TAPE_DRIVE_LOGICAL_BLK |            TAPE_DRIVE_END_OF_DATA |            TAPE_DRIVE_FILEMARKS |            TAPE_DRIVE_SEQUENTIAL_FMKS |            TAPE_DRIVE_REVERSE_POSITION |            TAPE_DRIVE_WRITE_FILEMARKS;    }    ExFreePool(buffer);    if (!NT_SUCCESS(status)) {        return status;    }    //    // Zero CDB in SRB on stack.    //    RtlZeroMemory(cdb, MAXIMUM_CDB_SIZE);    srb.CdbLength = CDB6GENERIC_LENGTH;    cdb->CDB6GENERIC.OperationCode = SCSIOP_READ_BLOCK_LIMITS;    //    // Set timeout value.    //    srb.TimeOutValue = deviceExtension->TimeOutValue;    blockLimits = ExAllocatePool(NonPagedPoolCacheAligned,        sizeof(READ_BLOCK_LIMITS_DATA));    if (!blockLimits) {        return STATUS_INSUFFICIENT_RESOURCES;    }    RtlZeroMemory(blockLimits, sizeof(READ_BLOCK_LIMITS_DATA));    status = ScsiClassSendSrbSynchronous(DeviceObject,                                &srb,                                blockLimits,                                sizeof(READ_BLOCK_LIMITS_DATA),                                FALSE);    if (NT_SUCCESS(status)) {        tapeGetDriveParams->MaximumBlockSize = blockLimits->BlockMaximumSize[2];        tapeGetDriveParams->MaximumBlockSize += (blockLimits->BlockMaximumSize[1] << 8);        tapeGetDriveParams->MaximumBlockSize += (blockLimits->BlockMaximumSize[0] << 16);        tapeGetDriveParams->MinimumBlockSize = blockLimits->BlockMinimumSize[1];        tapeGetDriveParams->MinimumBlockSize += (blockLimits->BlockMinimumSize[0] << 8);    }    ExFreePool(blockLimits);    return status;} // end TapeGetDriveParameters()
开发者ID:BillTheBest,项目名称:WinNT4,代码行数:101,


示例2: MsfsCreate

/* Creates the client side */NTSTATUS DEFAULTAPIMsfsCreate(PDEVICE_OBJECT DeviceObject,           PIRP Irp){    PIO_STACK_LOCATION IoStack;    PFILE_OBJECT FileObject;    PMSFS_DEVICE_EXTENSION DeviceExtension;    PMSFS_FCB Fcb;    PMSFS_CCB Ccb;    PMSFS_FCB current = NULL;    PLIST_ENTRY current_entry;    KIRQL oldIrql;    DPRINT("MsfsCreate(DeviceObject %p Irp %p)/n", DeviceObject, Irp);    IoStack = IoGetCurrentIrpStackLocation(Irp);    DeviceExtension = DeviceObject->DeviceExtension;    FileObject = IoStack->FileObject;    DPRINT("Mailslot name: %wZ/n", &FileObject->FileName);    Ccb = ExAllocatePool(NonPagedPool, sizeof(MSFS_CCB));    if (Ccb == NULL)    {        Irp->IoStatus.Status = STATUS_NO_MEMORY;        Irp->IoStatus.Information = 0;        IoCompleteRequest(Irp, IO_NO_INCREMENT);        return STATUS_NO_MEMORY;    }    KeLockMutex(&DeviceExtension->FcbListLock);    current_entry = DeviceExtension->FcbListHead.Flink;    while (current_entry != &DeviceExtension->FcbListHead)    {        current = CONTAINING_RECORD(current_entry,                                    MSFS_FCB,                                    FcbListEntry);        if (!RtlCompareUnicodeString(&FileObject->FileName, &current->Name, TRUE))            break;        current_entry = current_entry->Flink;    }    if (current_entry == &DeviceExtension->FcbListHead)    {        ExFreePool(Ccb);        KeUnlockMutex(&DeviceExtension->FcbListLock);        Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;        Irp->IoStatus.Information = 0;        IoCompleteRequest(Irp, IO_NO_INCREMENT);        return STATUS_UNSUCCESSFUL;    }    Fcb = current;    KeAcquireSpinLock(&Fcb->CcbListLock, &oldIrql);    InsertTailList(&Fcb->CcbListHead, &Ccb->CcbListEntry);    KeReleaseSpinLock(&Fcb->CcbListLock, oldIrql);    Fcb->ReferenceCount++;    Ccb->Fcb = Fcb;    KeUnlockMutex(&DeviceExtension->FcbListLock);    FileObject->FsContext = Fcb;    FileObject->FsContext2 = Ccb;    FileObject->Flags |= FO_MAILSLOT;    Irp->IoStatus.Status = STATUS_SUCCESS;    Irp->IoStatus.Information = 0;    IoCompleteRequest(Irp, IO_NO_INCREMENT);    return STATUS_SUCCESS;}
开发者ID:hoangduit,项目名称:reactos,代码行数:82,


示例3: SeLocateProcessImageName

NTSTATUSNTAPISeLocateProcessImageName(IN PEPROCESS Process,                         OUT PUNICODE_STRING *ProcessImageName){    POBJECT_NAME_INFORMATION AuditName;    PUNICODE_STRING ImageName;    PFILE_OBJECT FileObject;    NTSTATUS Status = STATUS_SUCCESS;    PAGED_CODE();    /* Assume failure */    *ProcessImageName = NULL;    /* Check if we have audit info */    AuditName = Process->SeAuditProcessCreationInfo.ImageFileName;    if (!AuditName)    {        /* Get the file object */        Status = PsReferenceProcessFilePointer(Process, &FileObject);        if (!NT_SUCCESS(Status)) return Status;        /* Initialize the audit structure */        Status = SeInitializeProcessAuditName(FileObject, TRUE, &AuditName);        if (NT_SUCCESS(Status))        {            /* Set it */            if (InterlockedCompareExchangePointer((PVOID*)&Process->                                                  SeAuditProcessCreationInfo.ImageFileName,                                                  AuditName,                                                  NULL))            {                /* Someone beat us to it, deallocate our copy */                ExFreePool(AuditName);            }        }        /* Dereference the file object */        ObDereferenceObject(FileObject);        if (!NT_SUCCESS(Status)) return Status;    }    /* Get audit info again, now we have it for sure */    AuditName = Process->SeAuditProcessCreationInfo.ImageFileName;    /* Allocate the output string */    ImageName = ExAllocatePoolWithTag(NonPagedPool,                                      AuditName->Name.MaximumLength +                                      sizeof(UNICODE_STRING),                                      TAG_SEPA);    if (!ImageName) return STATUS_NO_MEMORY;    /* Make a copy of it */    RtlCopyMemory(ImageName,                  &AuditName->Name,                  AuditName->Name.MaximumLength + sizeof(UNICODE_STRING));    /* Fix up the buffer */    ImageName->Buffer = (PWSTR)(ImageName + 1);    /* Return it */    *ProcessImageName = ImageName;    /* Return status */    return Status;}
开发者ID:Moteesh,项目名称:reactos,代码行数:67,


示例4: FsRtlGetTunnelParameterValue

NTSTATUSFsRtlGetTunnelParameterValue (    IN PUNICODE_STRING ValueName,    IN OUT PULONG Value    )/*++Routine Description:    Given a unicode value name this routine will go into the registry    location for the Tunnel parameter information and get the    value.Arguments:    ValueName - the unicode name for the registry value located in the                double space configuration location of the registry.    Value   - a pointer to the ULONG for the result.Return Value:    NTSTATUS    If STATUS_SUCCESSFUL is returned, the location *Value will be    updated with the DWORD value from the registry.  If any failing    status is returned, this value is untouched.--*/{    HANDLE Handle;    NTSTATUS Status;    ULONG RequestLength;    ULONG ResultLength;    UCHAR Buffer[KEY_WORK_AREA];    UNICODE_STRING KeyName;    OBJECT_ATTRIBUTES ObjectAttributes;    PKEY_VALUE_FULL_INFORMATION KeyValueInformation;    KeyName.Buffer = TUNNEL_KEY_NAME;    KeyName.Length = sizeof(TUNNEL_KEY_NAME) - sizeof(WCHAR);    KeyName.MaximumLength = sizeof(TUNNEL_KEY_NAME);    InitializeObjectAttributes(&ObjectAttributes,                               &KeyName,                               OBJ_CASE_INSENSITIVE,                               NULL,                               NULL);    Status = ZwOpenKey(&Handle,                       KEY_READ,                       &ObjectAttributes);    if (!NT_SUCCESS(Status)) {        return Status;    }    RequestLength = KEY_WORK_AREA;    KeyValueInformation = (PKEY_VALUE_FULL_INFORMATION)Buffer;    while (1) {        Status = ZwQueryValueKey(Handle,                                 ValueName,                                 KeyValueFullInformation,                                 KeyValueInformation,                                 RequestLength,                                 &ResultLength);        ASSERT( Status != STATUS_BUFFER_OVERFLOW );        if (Status == STATUS_BUFFER_OVERFLOW) {            //            // Try to get a buffer big enough.            //            if (KeyValueInformation != (PKEY_VALUE_FULL_INFORMATION)Buffer) {                ExFreePool(KeyValueInformation);            }            RequestLength += 256;            KeyValueInformation = (PKEY_VALUE_FULL_INFORMATION)                                  ExAllocatePoolWithTag(PagedPool,                                                        RequestLength,                                                        'KnuT');            if (!KeyValueInformation) {                return STATUS_NO_MEMORY;            }        } else {            break;        }//.........这里部分代码省略.........
开发者ID:BillTheBest,项目名称:WinNT4,代码行数:101,


示例5: DiskDeviceControl

//.........这里部分代码省略.........          status = STATUS_BUFFER_OVERFLOW;        }      } else {        DDbgPrint("   MountPoint %wZ is not a drive/n", dcb->MountPoint);        status = STATUS_NOT_FOUND;      }    } else {      DDbgPrint("   MountPoint is NULL or undefined/n");      status = STATUS_NOT_FOUND;    }  } break;  case IOCTL_MOUNTDEV_LINK_CREATED: {    PMOUNTDEV_NAME mountdevName = Irp->AssociatedIrp.SystemBuffer;    DDbgPrint("   IOCTL_MOUNTDEV_LINK_CREATED/n");    status = STATUS_SUCCESS;    if (!IsUnmountPending(DeviceObject) && mountdevName != NULL &&        mountdevName->NameLength > 0) {      WCHAR *symbolicLinkNameBuf =          ExAllocatePool((mountdevName->NameLength + 1) * sizeof(WCHAR));      if (symbolicLinkNameBuf == NULL) {        status = STATUS_INSUFFICIENT_RESOURCES;        break;      }      RtlZeroMemory(symbolicLinkNameBuf,                    (mountdevName->NameLength + 1) * sizeof(WCHAR));      RtlCopyMemory(symbolicLinkNameBuf, mountdevName->Name,                    mountdevName->NameLength);      DDbgPrint("   MountDev Name: %ws/n", symbolicLinkNameBuf);      if (wcsncmp(symbolicLinkNameBuf, L"//DosDevices//", 12) == 0) {        if (dcb->MountPoint != NULL && dcb->MountPoint->Length == 0) {          ExFreePool(dcb->MountPoint);          dcb->MountPoint = NULL;        }        if (dcb->MountPoint == NULL) {          DDbgPrint("   Not current MountPoint. MountDev set as MountPoint/n");          dcb->MountPoint = DokanAllocateUnicodeString(symbolicLinkNameBuf);          if (dcb->DiskDeviceName != NULL) {            PMOUNT_ENTRY mountEntry;            PDOKAN_CONTROL dokanControl = ExAllocatePool(sizeof(DOKAN_CONTROL));            if (dokanControl == NULL) {              ExFreePool(symbolicLinkNameBuf);              status = STATUS_INSUFFICIENT_RESOURCES;              break;            }            RtlZeroMemory(dokanControl, sizeof(*dokanControl));            RtlCopyMemory(dokanControl->DeviceName, dcb->DiskDeviceName->Buffer,                          dcb->DiskDeviceName->Length);            if (dcb->UNCName->Buffer != NULL && dcb->UNCName->Length > 0) {              RtlCopyMemory(dokanControl->UNCName, dcb->UNCName->Buffer,                            dcb->UNCName->Length);            }            mountEntry = FindMountEntry(dcb->Global, dokanControl, TRUE);            ExFreePool(dokanControl);            if (mountEntry != NULL) {              RtlStringCchCopyW(mountEntry->MountControl.MountPoint,                                MAXIMUM_FILENAME_LENGTH, symbolicLinkNameBuf);            } else {              DDbgPrint("   Cannot found associated MountEntry./n");            }          } else {            DDbgPrint(                "   DiskDeviceName is null. Is device currently unmounted?/n");          }
开发者ID:marinkobabic,项目名称:dokany,代码行数:67,


示例6: KDispatchIoctl

NTSTATUS KDispatchIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){    NTSTATUS              status = STATUS_UNSUCCESSFUL;    PIO_STACK_LOCATION    irpStack  = IoGetCurrentIrpStackLocation(Irp);    PPROCESS_EVENT        pProcessEvent;	PCHAR pOutputBuffer;	PPROCESS_INFORMATION pInputBuffer;	UINT dwDataWritten = 0;	PCAPTURE_PROCESS_MANAGER pProcessManager;	/* Get the process manager from the device extension */    pProcessManager = gpDeviceObject->DeviceExtension;    switch(irpStack->Parameters.DeviceIoControl.IoControlCode)    {        case IOCTL_CAPTURE_GET_PROCINFO:			/* Update the time the user space program last sent an IOCTL */			//UpdateLastContactTime();			/* Return some of the process events that are queued */            if(irpStack->Parameters.DeviceIoControl.OutputBufferLength >= sizeof(PROCESS_EVENT))            {				ULONG left = irpStack->Parameters.DeviceIoControl.OutputBufferLength;				ULONG done = 0;				pOutputBuffer = Irp->UserBuffer;				__try {					ProbeForWrite(pOutputBuffer, 								irpStack->Parameters.DeviceIoControl.OutputBufferLength,								__alignof (PROCESS_EVENT));					//ExAcquireFastMutex(&pProcessManager->mProcessWaitingSpinLock);					//if(pProcessManager->pCurrentProcessEvent != NULL)					//{					//	RtlCopyMemory(pOutputBuffer+done, pProcessManager->pCurrentProcessEvent, sizeof(PROCESS_EVENT));					//	done += sizeof(PROCESS_EVENT);					//	ExFreePoolWithTag(pProcessManager->pCurrentProcessEvent, PROCESS_POOL_TAG);					//	pProcessManager->pCurrentProcessEvent = NULL;					//}					//ExReleaseFastMutex(&pProcessManager->mProcessWaitingSpinLock);										if(!IsListEmpty(&pProcessManager->lQueuedProcessEvents))					{						PLIST_ENTRY head;						PPROCESS_EVENT_PACKET pProcessEventPacket;						head = ExInterlockedRemoveHeadList(&pProcessManager->lQueuedProcessEvents, &pProcessManager->lQueuedProcessEventsSpinLock);						pProcessManager->nQueuedProcessEvents--;						pProcessEventPacket = CONTAINING_RECORD(head, PROCESS_EVENT_PACKET, Link);												RtlCopyMemory(pOutputBuffer, &pProcessEventPacket->processEvent, sizeof(PROCESS_EVENT));						done = sizeof(PROCESS_EVENT);						ExFreePool(pProcessEventPacket);						// Notify that we still have process events queued						if( pProcessManager->nQueuedProcessEvents )						{							KeSetEvent(pProcessManager->eNewProcessEvent, 0, FALSE);							KeClearEvent(pProcessManager->eNewProcessEvent);						}					}										dwDataWritten = done;					status = STATUS_SUCCESS;				} __except( EXCEPTION_EXECUTE_HANDLER ) {					DbgPrint("CaptureProcessMonitor: EXCEPTION IOCTL_CAPTURE_GET_PROCINFO - %08x/n", GetExceptionCode());					status = GetExceptionCode();     				}                    }            break;        default:            break;    }
开发者ID:0x4d4e,项目名称:HSN-Capture-HPC-NG,代码行数:70,


示例7: LfsReadNextLogRecord

//.........这里部分代码省略.........                                  Buffer );                FoundNextLsn = TRUE;            }        } __finally {            DebugUnwind( LfsReadNextLogRecord );            //            //  If we exited due to an error, we have to restore the context            //  block.            //            if (UnwindRememberLcbFields) {                if (AbnormalTermination()) {                    //                    //  If the record header in the context block is not                    //  the same as we started with.  Then we unpin that                    //  data.                    //                    if (Lcb->RecordHeaderBcb != NULL) {                        CcUnpinData( Lcb->RecordHeaderBcb );                    }                    if (Lcb->CurrentLogRecord != NULL                        && Lcb->AuxilaryBuffer == TRUE) {                        ExFreePool( Lcb->CurrentLogRecord );                    }                    Lcb->RecordHeaderBcb = UnwindRecordHeaderBcb;                    Lcb->RecordHeader = UnwindRecordHeader;                    Lcb->CurrentLogRecord = UnwindCurrentLogRecord;                    Lcb->AuxilaryBuffer = UnwindAuxilaryBuffer;                //                //  Otherwise, if we have successfully found the next Lsn,                //  we free up any resources being held from the previous search.                //                } else if (FoundNextLsn ) {                    if (UnwindRecordHeaderBcb != NULL) {                        CcUnpinData( UnwindRecordHeaderBcb );                    }                    if (UnwindCurrentLogRecord != NULL                        && UnwindAuxilaryBuffer == TRUE) {                        ExFreePool( UnwindCurrentLogRecord );                    }                //                //  Restore the Bcb and auxilary buffer field for the final                //  cleanup.                //                } else {
开发者ID:conioh,项目名称:os-design,代码行数:66,


示例8: ReleaseTimeoutPendingIrp

NTSTATUSReleaseTimeoutPendingIrp(   PDEVICE_EXTENSION	DeviceExtension   ){	KIRQL				oldIrql;    PLIST_ENTRY			thisEntry, nextEntry, listHead;	PIRP_ENTRY			irpEntry;	LARGE_INTEGER		tickCount;	LIST_ENTRY			completeList;	PIRP				irp;	DDbgPrint("==> ReleaseTimeoutPendingIRP/n");	InitializeListHead(&completeList);	ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);	KeAcquireSpinLock(&DeviceExtension->PendingIrp.ListLock, &oldIrql);	// when IRP queue is empty, there is nothing to do	if (IsListEmpty(&DeviceExtension->PendingIrp.ListHead)) {		KeReleaseSpinLock(&DeviceExtension->PendingIrp.ListLock, oldIrql);		DDbgPrint("  IrpQueue is Empty/n");		return STATUS_SUCCESS;	}	KeQueryTickCount(&tickCount);	// search timeout IRP through pending IRP list	listHead = &DeviceExtension->PendingIrp.ListHead;    for (thisEntry = listHead->Flink;		thisEntry != listHead;		thisEntry = nextEntry) {        nextEntry = thisEntry->Flink;        irpEntry = CONTAINING_RECORD(thisEntry, IRP_ENTRY, ListEntry);		// this IRP is NOT timeout yet		if ( (tickCount.QuadPart - irpEntry->TickCount.QuadPart) * KeQueryTimeIncrement()			< DOKAN_IPR_PENDING_TIMEOUT * 10000 * 1000) {			break;		}		RemoveEntryList(thisEntry);		DDbgPrint(" timeout Irp #%X/n", irpEntry->SerialNumber);		irp = irpEntry->Irp;		if (irp == NULL) {			// this IRP has already been canceled			ASSERT(irpEntry->CancelRoutineFreeMemory == FALSE);			ExFreePool(irpEntry);			continue;		}		// this IRP is not canceled yet		if (IoSetCancelRoutine(irp, NULL) == NULL) {			// Cancel routine will run as soon as we release the lock			InitializeListHead(&irpEntry->ListEntry);			irpEntry->CancelRoutineFreeMemory = TRUE;			continue;		}		// IrpEntry is saved here for CancelRoutine		// Clear it to prevent to be completed by CancelRoutine twice		irp->Tail.Overlay.DriverContext[DRIVER_CONTEXT_IRP_ENTRY] = NULL;		InsertTailList(&completeList, &irpEntry->ListEntry);	}	if (IsListEmpty(&DeviceExtension->PendingIrp.ListHead)) {		KeClearEvent(&DeviceExtension->PendingIrp.NotEmpty);	}	KeReleaseSpinLock(&DeviceExtension->PendingIrp.ListLock, oldIrql);		while (!IsListEmpty(&completeList)) {		listHead = RemoveHeadList(&completeList);		irpEntry = CONTAINING_RECORD(listHead, IRP_ENTRY, ListEntry);		irp = irpEntry->Irp;		irp->IoStatus.Information = 0;		irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;		ExFreePool(irpEntry);		IoCompleteRequest(irp, IO_NO_INCREMENT);	}	DDbgPrint("<== ReleaseTimeoutPendingIRP/n");	return STATUS_SUCCESS;}
开发者ID:ohierro,项目名称:gDrive,代码行数:88,


示例9: NduDispatchRead

//.........这里部分代码省略.........    if (OpenEntry->WriteOnly)    {        Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;        Irp->IoStatus.Information = 0;        IoCompleteRequest(Irp, IO_NO_INCREMENT);                return STATUS_INVALID_PARAMETER;    }    /* Make the read cancellable */    IoAcquireCancelSpinLock(&OldCancelIrql);    IoSetCancelRoutine(Irp, ReadIrpCancel);    if (Irp->Cancel)    {        IoReleaseCancelSpinLock(OldCancelIrql);        /* Indicate a 0 byte read */        Irp->IoStatus.Status = STATUS_SUCCESS;        Irp->IoStatus.Information = 0;        IoCompleteRequest(Irp, IO_NO_INCREMENT);                return STATUS_SUCCESS;    }    IoReleaseCancelSpinLock(OldCancelIrql);    while (TRUE)    {        KeAcquireSpinLock(&AdapterContext->Spinlock, &OldIrql);        /* Check if we have a packet */        if (IsListEmpty(&AdapterContext->PacketList))        {            KeReleaseSpinLock(&AdapterContext->Spinlock, OldIrql);            /* Wait for a packet (in the context of the calling user thread) */            Status = KeWaitForSingleObject(&AdapterContext->PacketReadEvent,                                           UserRequest,                                           UserMode,                                           TRUE,                                           NULL);            if (Status != STATUS_SUCCESS)            {                /* Remove the cancel routine */                IoAcquireCancelSpinLock(&OldCancelIrql);                IoSetCancelRoutine(Irp, NULL);                IoReleaseCancelSpinLock(OldCancelIrql);                break;            }        }        else        {            /* Remove the cancel routine */            IoAcquireCancelSpinLock(&OldCancelIrql);            IoSetCancelRoutine(Irp, NULL);            IoReleaseCancelSpinLock(OldCancelIrql);                        /* Remove the first packet in the list */            ListEntry = RemoveHeadList(&AdapterContext->PacketList);            PacketEntry = CONTAINING_RECORD(ListEntry, NDISUIO_PACKET_ENTRY, ListEntry);            /* Release the adapter lock */            KeReleaseSpinLock(&AdapterContext->Spinlock, OldIrql);                        /* And we're done with this loop */            Status = STATUS_SUCCESS;            break;        }    }        /* Check if we got a packet */    if (PacketEntry != NULL)    {        /* Find the right amount of bytes to copy */        BytesCopied = PacketEntry->PacketLength;        if (BytesCopied > IrpSp->Parameters.Read.Length)            BytesCopied = IrpSp->Parameters.Read.Length;        /* Copy the packet */        RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,                      &PacketEntry->PacketData[0],                      BytesCopied);                /* Free the packet entry */        ExFreePool(PacketEntry);    }    else    {        /* Something failed */        BytesCopied = 0;    }    /* Complete the IRP */    Irp->IoStatus.Status = Status;    Irp->IoStatus.Information = BytesCopied;    IoCompleteRequest(Irp, IO_NETWORK_INCREMENT);        return Status;}
开发者ID:GYGit,项目名称:reactos,代码行数:101,


示例10: EnumProcessModuleByVM

//.........这里部分代码省略.........	//ReLoadNtosCALL((PVOID)(&RExAllocatePool),L"ExAllocatePool",SystemKernelModuleBase,(ULONG)ImageModuleBase);	//ReLoadNtosCALL((PVOID)(&RExFreePool),L"ExFreePool",SystemKernelModuleBase,(ULONG)ImageModuleBase);	//ReLoadNtosCALL((PVOID)(&RZwClose),L"ZwClose",SystemKernelModuleBase,(ULONG)ImageModuleBase);	//if (ZwQueryVirtualMemory &&	//	RObOpenObjectByPointer &&	//	RExAllocatePool &&	//	RExFreePool &&	//	RZwClose)	//{	//	bInit = TRUE;	//}	//if (!bInit)	//	return ;	////进程已经退出鸟	//if (!IsExitProcess((PEPROCESS)EProcess)){	//	return ;	//}	status = ObOpenObjectByPointer(		(PVOID)pEProcess,          // Object    		OBJ_KERNEL_HANDLE,  // HandleAttributes    		NULL,               // PassedAccessState OPTIONAL    		(ACCESS_MASK)0,       // DesiredAccess    		*PsProcessType,     // ObjectType    		KernelMode,         // AccessMode    		&hProcess);    	if (!NT_SUCCESS(status))	{		//if (DebugOn)		//KdPrint(("ObOpenObjectByPointer failed:%d",RtlNtStatusToDosError(status)));		return ;	}	pSectionNam = (PUNICODE_STRING)ExAllocatePool(NonPagedPool, MAX_PATH * sizeof(WCHAR));	if (!pSectionNam)	{		ZwClose(hProcess);		return;	}	RtlZeroMemory(pSectionNam->Buffer, MAX_PATH * sizeof(WCHAR));	pSectionNam->MaximumLength = MAX_PATH;	__try	{		for (dwStartAddr = 0; dwStartAddr < 0x7fffffff; dwStartAddr = dwStartAddr + 0x10000)		{			status = ZwQueryVirtualMemory(				hProcess,				(PVOID)dwStartAddr,				MemoryBasicInformation,				&mbi,				sizeof(MEMORY_BASIC_INFORMATION),				0				);			if (NT_SUCCESS(status) && mbi.Type == MEM_IMAGE)			{				status = ZwQueryVirtualMemory(					hProcess,					(PVOID)dwStartAddr,					MemorySectionName,					pSectionNam,					MAX_PATH*sizeof(WCHAR),					0					);				if (NT_SUCCESS(status) && !MmIsAddressValid(pSectionNam->Buffer))				{					//如果当前的DLL模块路径 不等于前一个,则说明是开始了下一个DLL的枚举了,首先判断第一个字节是否是'/'					if (((PCHAR)pSectionNam->Buffer)[0] == 0x5c)					{ 						if (count == -1 ||/							RtlCompareMemory(pAllModuleInf->vModuleInf[count].ImagePathName, pSectionNam->Buffer, pSectionNam->Length)/							!= pSectionNam->Length)						{							RtlCopyMemory(pAllModuleInf->vModuleInf[++count].ImagePathName, pSectionNam->Buffer, pSectionNam->Length);							for (ulDllSize = dwStartAddr+mbi.RegionSize; ulDllSize < 0x7fffffff; ulDllSize += mbi.RegionSize)							{								status = ZwQueryVirtualMemory(									hProcess,									(PVOID)ulDllSize,									MemoryBasicInformation,									&mbi,									sizeof(MEMORY_BASIC_INFORMATION),									0									);								if (NT_SUCCESS(status) && mbi.Type != MEM_IMAGE)								{									pAllModuleInf->vModuleInf[count].size = ulDllSize - dwStartAddr;								}							}						}					}				}			}		}	}__except(EXCEPTION_EXECUTE_HANDLER){}_FunctionRet:	pAllModuleInf->uCount = count;	ExFreePool(pSectionNam);	ZwClose(hProcess);}
开发者ID:jinyongjie,项目名称:jyj_github,代码行数:101,


示例11: CreateSdpRecord

//.........这里部分代码省略.........        goto exit;    }    nodeName = NULL; //transferred owenership to tree        nodeDesc = SdpNodeInterface->SdpCreateNodeString(        ansiStrName.Buffer,         ansiStrName.Length,         POOLTAG_BTHECHOSAMPLE        );    if(NULL == nodeDesc)    {        status = STATUS_INSUFFICIENT_RESOURCES;        TraceEvents(TRACE_LEVEL_ERROR, DBG_SDP,             "Creating node for service desc failed, Status code %!STATUS!/n", status);        goto exit;    }        status = SdpNodeInterface->SdpAddAttributeToTree(        tree,         LANG_DEFAULT_ID+STRING_DESCRIPTION_OFFSET,         nodeDesc,         POOLTAG_BTHECHOSAMPLE        );    if(!NT_SUCCESS(status))    {        TraceEvents(TRACE_LEVEL_ERROR, DBG_SDP,             "SdpAddAttributeToTree for service desc failed, Status code %!STATUS!/n", status);                goto exit;    }    nodeDesc = NULL;    //    // Create stream from tree    //    status = SdpParseInterface->SdpConvertTreeToStream(tree, &stream, &size, POOLTAG_BTHECHOSAMPLE);    if(!NT_SUCCESS(status))    {        TraceEvents(TRACE_LEVEL_ERROR, DBG_SDP,             "Failed to get stream from tree for SDP record, Status code %!STATUS!/n", status);                goto exit;    }    status = SdpParseInterface->SdpValidateStream(        stream,        size,        &errorByte        );    if(!NT_SUCCESS(status))    {        TraceEvents(TRACE_LEVEL_ERROR, DBG_SDP,             "Validate stream failed for SDP record, first failure at address %p/n", (PVOID)errorByte);                goto exit;    }    *Stream = stream;    *Size = size;    exit:    if (NULL != tree)    {        SdpNodeInterface->SdpFreeTree(tree);    }    if (NULL != nodeName)    {        //        // If we failed to add attribute to tree use ExFreePool to free it        //        ExFreePool(nodeName);    }        if (NULL != nodeDesc)    {        //        // If we failed to add attribute to tree use ExFreePool to free it        //        ExFreePool(nodeDesc);    }        RtlFreeAnsiString(&ansiStrName);    if (!NT_SUCCESS(status))    {        if (stream != NULL)        {            ExFreePoolWithTag(stream, POOLTAG_BTHECHOSAMPLE);        }    }        return status;}
开发者ID:0xhack,项目名称:Windows-driver-samples,代码行数:101,


示例12: free_cache

void STDCALL free_cache() {    ExFreePool(cache_callbacks);}
开发者ID:CSRedRat,项目名称:btrfs,代码行数:3,


示例13: TapeSetMediaParameters

NTSTATUSTapeSetMediaParameters(    IN PDEVICE_OBJECT DeviceObject,    IN PIRP Irp    )/*++Routine Description:    This routine sets the fixed-length logical block size or variable-length    block mode (if the block size is 0).Arguments:    DeviceObject    IrpReturn Value:    NTSTATUS--*/{    PDEVICE_EXTENSION   deviceExtension = DeviceObject->DeviceExtension;    PTAPE_SET_MEDIA_PARAMETERS tapeSetMediaParams = Irp->AssociatedIrp.SystemBuffer;    PMODE_PARM_READ_WRITE_DATA buffer;    SCSI_REQUEST_BLOCK  srb;    PCDB                cdb = (PCDB)srb.Cdb;    NTSTATUS            status;    DebugPrint((3,"TapeIoControl: Set Tape Media Parameters /n"));    //    // Zero CDB in SRB on stack.    //    RtlZeroMemory(cdb, MAXIMUM_CDB_SIZE);    srb.CdbLength = CDB6GENERIC_LENGTH;    cdb->MODE_SELECT.OperationCode = SCSIOP_MODE_SELECT;    //    // Set timeout value.    //    srb.TimeOutValue = deviceExtension->TimeOutValue;    cdb->MODE_SELECT.ParameterListLength = sizeof(MODE_PARM_READ_WRITE_DATA);    cdb->MODE_SELECT.Reserved1 = MODE_SELECT_PFBIT;    buffer = ExAllocatePool(NonPagedPoolCacheAligned,        sizeof(MODE_PARM_READ_WRITE_DATA));    if (!buffer) {        return STATUS_INSUFFICIENT_RESOURCES;    }    RtlZeroMemory(buffer, sizeof(MODE_PARM_READ_WRITE_DATA));    buffer->ParameterListHeader.DeviceSpecificParameter = 0x10;    buffer->ParameterListHeader.BlockDescriptorLength = MODE_BLOCK_DESC_LENGTH;    buffer->ParameterListBlock.BlockLength[0] =        (UCHAR)((tapeSetMediaParams->BlockSize >> 16) & 0xFF);    buffer->ParameterListBlock.BlockLength[1] =        (UCHAR)((tapeSetMediaParams->BlockSize >> 8) & 0xFF);    buffer->ParameterListBlock.BlockLength[2] =        (UCHAR)(tapeSetMediaParams->BlockSize & 0xFF);    status = ScsiClassSendSrbSynchronous(DeviceObject,                                &srb,                                buffer,                                sizeof( MODE_PARM_READ_WRITE_DATA ),                                TRUE);    ExFreePool(buffer);    return status;} // end TapeSetMediaParameters()
开发者ID:BillTheBest,项目名称:WinNT4,代码行数:82,


示例14: TapeGetMediaParameters

NTSTATUSTapeGetMediaParameters(    IN PDEVICE_OBJECT DeviceObject,    IN PIRP Irp    )/*++Routine Description:    The OVERLAND 9-track tape device can return whether media is    write-protected.Arguments:    DeviceObject    IrpReturn Value:    NTSTATUS--*/{    PDEVICE_EXTENSION   deviceExtension = DeviceObject->DeviceExtension;    PTAPE_GET_MEDIA_PARAMETERS tapeGetMediaParams = Irp->AssociatedIrp.SystemBuffer;    PNINE_TRACKSENSE_DATA  buffer;    SCSI_REQUEST_BLOCK  srb;    PCDB                cdb = (PCDB)srb.Cdb;    NTSTATUS            status;    DebugPrint((3,"TapeGetMediaParameters: Get Tape Media Parameters/n"));    //    // Zero SRB on stack.    //    RtlZeroMemory(&srb, sizeof(SCSI_REQUEST_BLOCK));    srb.CdbLength = CDB6GENERIC_LENGTH;    cdb->MODE_SENSE.OperationCode = SCSIOP_MODE_SENSE;    //    // Set timeout value.    //    srb.TimeOutValue = deviceExtension->TimeOutValue;    cdb->MODE_SENSE.AllocationLength = sizeof(NINE_TRACKSENSE_DATA);    cdb->MODE_SENSE.PageCode = MODE_SENSE_CURRENT_VALUES;    cdb->MODE_SENSE.Pc = 0x0B;    buffer = ExAllocatePool(NonPagedPoolCacheAligned,        sizeof(NINE_TRACKSENSE_DATA));    if (!buffer) {        return STATUS_INSUFFICIENT_RESOURCES;    }    status = ScsiClassSendSrbSynchronous(DeviceObject,                                &srb,                                buffer,                                sizeof(NINE_TRACKSENSE_DATA),                                FALSE);    if (status == STATUS_DATA_OVERRUN) {        status = STATUS_SUCCESS;    }    if (NT_SUCCESS(status)) {        Irp->IoStatus.Information = sizeof(TAPE_GET_MEDIA_PARAMETERS);        tapeGetMediaParams->BlockSize = buffer->BlockLength[2];        tapeGetMediaParams->BlockSize += buffer->BlockLength[1] << 8;        tapeGetMediaParams->BlockSize += buffer->BlockLength[0] << 16;        tapeGetMediaParams->WriteProtected = buffer->WriteProtected;        tapeGetMediaParams->PartitionCount = 0;    }    ExFreePool(buffer);    return status;    return status;} // end TapeGetMediaParameters()
开发者ID:BillTheBest,项目名称:WinNT4,代码行数:87,


示例15: FatPostStackOverflowRead

NTSTATUSFatPostStackOverflowRead (    IN PIRP_CONTEXT IrpContext,    IN PIRP Irp,    IN PFCB Fcb)/*++Routine Description:    This routine posts a read request that could not be processed by    the fsp thread because of stack overflow potential.Arguments:    Irp - Supplies the request to process.    Fcb - Supplies the file.Return Value:    STATUS_PENDING.--*/{    PKEVENT Event;    PERESOURCE Resource;    DebugTrace(0, Dbg, "Getting too close to stack limit pass request to Fsp/n", 0 );    //    //  Allocate an event and get shared on the resource we will    //  be later using the common read.    //    Event = FsRtlAllocatePool( NonPagedPool, sizeof(KEVENT) );    KeInitializeEvent( Event, NotificationEvent, FALSE );    if (FlagOn(Irp->Flags, IRP_PAGING_IO) && (Fcb->Header.PagingIoResource != NULL)) {        Resource = Fcb->Header.PagingIoResource;    } else {        Resource = Fcb->Header.Resource;    }    ExAcquireResourceShared( Resource, TRUE );    try {        //        //  Make the Irp just like a regular post request and        //  then send the Irp to the special overflow thread.        //  After the post we will wait for the stack overflow        //  read routine to set the event that indicates we can        //  now release the scb resource and return.        //        FatPrePostIrp( IrpContext, Irp );        //        //  If this read is the result of a verify, we have to        //  tell the overflow read routne to temporarily        //  hijack the Vcb->VerifyThread field so that reads        //  can go through.        //        if (Fcb->Vcb->VerifyThread == KeGetCurrentThread()) {            SetFlag(IrpContext->Flags, IRP_CONTEXT_FLAG_VERIFY_READ);        }        FsRtlPostStackOverflow( IrpContext, Event, FatStackOverflowRead );        //        //  And wait for the worker thread to complete the item        //        (VOID) KeWaitForSingleObject( Event, Executive, KernelMode, FALSE, NULL );    }    finally {        ExReleaseResource( Resource );        ExFreePool( Event );    }    return STATUS_PENDING;}
开发者ID:BillTheBest,项目名称:WinNT4,代码行数:93,


示例16: LpcpDestroyPortQueue

//.........这里部分代码省略.........    /* Check if this is a connection port */    if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CONNECTION_PORT)    {        /* Delete the name */        Port->Flags |= LPCP_NAME_DELETED;    }    /* Walk all the threads waiting and signal them */    ListHead = &Port->LpcReplyChainHead;    NextEntry = ListHead->Flink;    while ((NextEntry) && (NextEntry != ListHead))    {        /* Get the Thread */        Thread = CONTAINING_RECORD(NextEntry, ETHREAD, LpcReplyChain);        /* Make sure we're not in exit */        if (Thread->LpcExitThreadCalled) break;        /* Move to the next entry */        NextEntry = NextEntry->Flink;        /* Remove and reinitialize the List */        RemoveEntryList(&Thread->LpcReplyChain);        InitializeListHead(&Thread->LpcReplyChain);        /* Check if someone is waiting */        if (!KeReadStateSemaphore(&Thread->LpcReplySemaphore))        {            /* Get the message */            Message = LpcpGetMessageFromThread(Thread);            if (Message)            {                /* Check if it's a connection request */                if (Message->Request.u2.s2.Type == LPC_CONNECTION_REQUEST)                {                    /* Get the connection message */                    ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(Message + 1);                    /* Check if it had a section */                    if (ConnectMessage->SectionToMap)                    {                        /* Dereference it */                        ObDereferenceObject(ConnectMessage->SectionToMap);                    }                }                /* Clear the reply message */                Thread->LpcReplyMessage = NULL;                /* And remove the message from the port zone */                LpcpFreeToPortZone(Message, 1);                NextEntry = Port->LpcReplyChainHead.Flink;            }            /* Release the semaphore and reset message id count */            Thread->LpcReplyMessageId = 0;            KeReleaseSemaphore(&Thread->LpcReplySemaphore, 0, 1, FALSE);        }    }    /* Reinitialize the list head */    InitializeListHead(&Port->LpcReplyChainHead);    /* Loop queued messages */    while ((Port->MsgQueue.ReceiveHead.Flink) &&           !(IsListEmpty(&Port->MsgQueue.ReceiveHead)))    {        /* Get the message */        Message = CONTAINING_RECORD(Port->MsgQueue.ReceiveHead.Flink,                                    LPCP_MESSAGE,                                    Entry);        /* Free and reinitialize it's list head */        RemoveEntryList(&Message->Entry);        InitializeListHead(&Message->Entry);        /* Remove it from the port zone */        LpcpFreeToPortZone(Message, 1);    }    /* Release the lock */    KeReleaseGuardedMutex(&LpcpLock);    /* Dereference the connection port */    if (ConnectionPort) ObDereferenceObject(ConnectionPort);    /* Check if we have to free the port entirely */    if (Destroy)    {        /* Check if the semaphore exists */        if (Port->MsgQueue.Semaphore)        {            /* Use the semaphore to find the port queue and free it */            ExFreePool(CONTAINING_RECORD(Port->MsgQueue.Semaphore,                                         LPCP_NONPAGED_PORT_QUEUE,                                         Semaphore));        }    }}
开发者ID:killvxk,项目名称:NT_OS,代码行数:101,


示例17: IrpCreateFile

NTSTATUS	IrpCreateFile(	IN PUNICODE_STRING FileName,	IN ACCESS_MASK DesiredAccess,	__out PIO_STATUS_BLOCK IoStatusBlock,	IN ULONG FileAttributes,	IN ULONG ShareAccess,	IN ULONG CreateDisposition,	IN ULONG CreateOptions,	IN PDEVICE_OBJECT DeviceObject,	IN PDEVICE_OBJECT RealDevice,	OUT PFILE_OBJECT *Object	){	NTSTATUS status;	KEVENT event;	PIRP irp;	PIO_STACK_LOCATION irpSp;	IO_SECURITY_CONTEXT securityContext;	ACCESS_STATE accessState;	OBJECT_ATTRIBUTES objectAttributes;	PFILE_OBJECT fileObject;	AUX_ACCESS_DATA auxData;	PAGED_CODE();	RtlZeroMemory(&auxData, sizeof(AUX_ACCESS_DATA));		InitializeObjectAttributes(&objectAttributes, NULL, OBJ_CASE_INSENSITIVE| OBJ_KERNEL_HANDLE, 0, NULL);	status = ObCreateObject(KernelMode,		*IoFileObjectType,		&objectAttributes,		KernelMode,		NULL,		sizeof(FILE_OBJECT),		0,		0,		(PVOID *)&fileObject);	if (!NT_SUCCESS(status)) {		return status;	}	RtlZeroMemory(fileObject, sizeof(FILE_OBJECT));	fileObject->Type = IO_TYPE_FILE;	fileObject->Size = sizeof(FILE_OBJECT);	fileObject->DeviceObject = RealDevice;	//	fileObject->RelatedFileObject = NULL;	fileObject->Flags = FO_SYNCHRONOUS_IO;	fileObject->FileName.MaximumLength = FileName->MaximumLength;	fileObject->FileName.Buffer = (PWCH)ExAllocatePoolWithTag(NonPagedPool, FileName->MaximumLength, 'File');	//fileObject->FileObjectExtension	if (fileObject->FileName.Buffer == NULL) {		ObDereferenceObject(fileObject);		return STATUS_INSUFFICIENT_RESOURCES;	}	RtlCopyUnicodeString(&fileObject->FileName, FileName);	KeInitializeEvent(&fileObject->Lock, SynchronizationEvent, FALSE);	KeInitializeEvent(&fileObject->Event, NotificationEvent, FALSE);	irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);		if (irp == NULL) {		ObDereferenceObject(fileObject);		return STATUS_INSUFFICIENT_RESOURCES;	}	KeInitializeEvent(&event, SynchronizationEvent, FALSE);	irp->MdlAddress = NULL;	irp->Flags |= IRP_CREATE_OPERATION | IRP_SYNCHRONOUS_API;	irp->RequestorMode = KernelMode;	irp->UserIosb = IoStatusBlock;	////LCXL:CHANGE	irp->UserEvent = &event;	//irp->UserEvent = NULL;	irp->PendingReturned = FALSE;	irp->Cancel = FALSE;	irp->CancelRoutine = NULL;	irp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();	irp->Tail.Overlay.AuxiliaryBuffer = NULL;	irp->Tail.Overlay.OriginalFileObject = fileObject;	status = SeCreateAccessState(&accessState,		&auxData,		DesiredAccess,		IoGetFileObjectGenericMapping());	if (!NT_SUCCESS(status)) {		IoFreeIrp(irp);		ExFreePool(fileObject->FileName.Buffer);		ObDereferenceObject(fileObject);		return status;	}	securityContext.SecurityQos = NULL;	securityContext.AccessState = &accessState;	securityContext.DesiredAccess = DesiredAccess;	securityContext.FullCreateOptions = 0;//.........这里部分代码省略.........
开发者ID:lcxl,项目名称:lcxl-shadow,代码行数:101,


示例18: UpdateDeviceInformation

//.........这里部分代码省略.........                                 sizeof(USB_STRING_DESCRIPTOR) + StringDescriptorBytes,                                 NULL);                status = SendAwaitUrb(fdo, &urb);        if(NT_SUCCESS(status))        {                        desc->bString[ (desc->bLength / 2) - 1 ] = L'/0';            RtlInitUnicodeString( &dummy       , desc->bString );            RtlCopyUnicodeString( &pdx->product, &dummy        );                    }        else        {            RtlInitUnicodeString( &dummy       , EmptyString );            RtlCopyUnicodeString( &pdx->product, &dummy      );                   KdPrint(( DRIVERNAME " - could not retrieve product %08x/n", status ));                  }    }    if(0 != pdx->dd.iSerialNumber)    {        // Serial Number        UsbBuildGetDescriptorRequest(&urb,                                  sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST),                                  USB_STRING_DESCRIPTOR_TYPE,                                 pdx->dd.iSerialNumber,                                 LangId,                                  desc,                                  NULL,                                  sizeof(USB_STRING_DESCRIPTOR) + StringDescriptorBytes,                                 NULL);                status = SendAwaitUrb(fdo, &urb);        if(NT_SUCCESS(status))        {                        desc->bString[ (desc->bLength / 2) - 1 ] = L'/0';                        RtlInitUnicodeString( &dummy            , desc->bString );            RtlCopyUnicodeString( &pdx->serialNumber, &dummy        );                    }        else        {                      RtlInitUnicodeString( &dummy            , EmptyString );            RtlCopyUnicodeString( &pdx->serialNumber, &dummy      );            KdPrint(( DRIVERNAME " - could not retrieve serial number %08x/n", status ));                    }    }        // DisplayName    UsbBuildGetDescriptorRequest(&urb,                              sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST),                              USB_STRING_DESCRIPTOR_TYPE,                             DisplayNameId,                             LangId,                              desc,                              NULL,                              sizeof(USB_STRING_DESCRIPTOR) + StringDescriptorBytes,                             NULL);        status = SendAwaitUrb(fdo, &urb);    if(NT_SUCCESS(status))    {                    desc->bString[ (desc->bLength / 2) - 1 ] = L'/0';                RtlInitUnicodeString( &dummy           , desc->bString );        RtlCopyUnicodeString( &pdx->displayName, &dummy        );            }    else    {        RtlInitUnicodeString( &dummy            , EmptyString );        RtlCopyUnicodeString( &pdx->displayName, &dummy      );        KdPrint(( DRIVERNAME " - could not retrieve display name %08x/n", status ));        }cleanup:        if(desc) ExFreePool( desc );        if(!NT_SUCCESS(status))    {        if(pdx->manufacturer.Buffer) ExFreePool( pdx->manufacturer.Buffer );        if(pdx->product     .Buffer) ExFreePool( pdx->product     .Buffer );        if(pdx->serialNumber.Buffer) ExFreePool( pdx->serialNumber.Buffer );        if(pdx->displayName .Buffer) ExFreePool( pdx->displayName .Buffer );        pdx->manufacturer.Buffer = NULL;        pdx->product     .Buffer = NULL;        pdx->serialNumber.Buffer = NULL;        pdx->displayName .Buffer = NULL;           }        return status;}
开发者ID:AustinWise,项目名称:Netduino-Micro-Framework,代码行数:101,


示例19: transfer

NTSTATUS transfer(libusb_device_t *dev, IRP *irp,                  int direction, int urb_function, int endpoint,                   int packet_size, MDL *buffer, int size){  IO_STACK_LOCATION *stack_location = NULL;  context_t *context;  NTSTATUS status = STATUS_SUCCESS;   DEBUG_PRINT_NL();  if(urb_function == URB_FUNCTION_ISOCH_TRANSFER)    DEBUG_MESSAGE("transfer(): isochronous transfer");  else    DEBUG_MESSAGE("transfer(): bulk or interrupt transfer");  if(direction == USBD_TRANSFER_DIRECTION_IN)    DEBUG_MESSAGE("transfer(): direction in");  else    DEBUG_MESSAGE("transfer(): direction out");  DEBUG_MESSAGE("transfer(): endpoint 0x%02x", endpoint);  if(urb_function == URB_FUNCTION_ISOCH_TRANSFER)    DEBUG_MESSAGE("transfer(): packet_size 0x%x", packet_size);  DEBUG_MESSAGE("transfer(): size %d", size);  DEBUG_MESSAGE("transfer(): sequence %d", sequence);  DEBUG_PRINT_NL();  if(!dev->config.value)    {      DEBUG_ERROR("transfer(): invalid configuration 0");      remove_lock_release(dev);      return complete_irp(irp, STATUS_INVALID_DEVICE_STATE, 0);    }    context = ExAllocatePool(NonPagedPool, sizeof(context_t));  if(!context)    {      remove_lock_release(dev);      return complete_irp(irp, STATUS_NO_MEMORY, 0);    }  status = create_urb(dev, &context->urb, direction, urb_function,                       endpoint, packet_size, buffer, size);      if(!NT_SUCCESS(status))    {      ExFreePool(context);      remove_lock_release(dev);      return complete_irp(irp, status, 0);    }  context->sequence = sequence++;  stack_location = IoGetNextIrpStackLocation(irp);      stack_location->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;  stack_location->Parameters.Others.Argument1 = context->urb;  stack_location->Parameters.DeviceIoControl.IoControlCode     = IOCTL_INTERNAL_USB_SUBMIT_URB;      IoSetCompletionRoutine(irp, transfer_complete, context,                         TRUE, TRUE, TRUE);      return IoCallDriver(dev->target_device, irp);}
开发者ID:Habib2014,项目名称:tinyos-2.x-contrib,代码行数:68,


示例20: StartDevice

//.........这里部分代码省略.........    ++ped;    if(!ped || 0 != (ped->bEndpointAddress & 0x80) || ped->bmAttributes != USB_ENDPOINT_TYPE_BULK || ped->wMaxPacketSize > 64)    {        KdPrint((DRIVERNAME " - Endpoint has wrong attributes/n"));        status = STATUS_DEVICE_CONFIGURATION_ERROR;        goto cleanup;    }    ++ped;    PUSBD_INTERFACE_INFORMATION pii = interfaces[0].Interface;    ASSERT(pii->NumberOfPipes == pid->bNumEndpoints);    // Initialize the maximum transfer size for each of the endpoints. The    // default would be PAGE_SIZE. The firmware itself only has a 4096-byte    // ring buffer, though. We need to restrict the test applet to that many    // bytes. In order to exercise the multi-segment aspect of the transfer code,    // therefore, reduce the maximum transfer size to 1024 bytes.    pii->Pipes[0].MaximumTransferSize = USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE;    pii->Pipes[1].MaximumTransferSize = USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE;    pdx->maxtransfer = USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE;    // Submit the set-configuration request    status = SendAwaitUrb(fdo, selurb);    if(!NT_SUCCESS(status))    {        KdPrint((DRIVERNAME " - Error %X trying to select configuration/n", status));        goto cleanup;    }    // Save the configuration and pipe handles    pdx->hconfig = selurb->UrbSelectConfiguration.ConfigurationHandle;    pdx->hinpipe = pii->Pipes[0].PipeHandle;    pdx->houtpipe = pii->Pipes[1].PipeHandle;    // Transfer ownership of the configuration descriptor to the device extension    pdx->pcd = pcd;    pcd = NULL;    // Enable the interface    IoSetDeviceInterfaceState(&pdx->operationsInterfaceName, TRUE);            // Enable the interface    IoSetDeviceInterfaceState(&pdx->inquiriesInterfaceName, TRUE);                        // create recovery thread                         status = PsCreateSystemThread(&RecoveryHandle, 0, NULL, NULL, NULL, RecoveryThread, (PVOID)pdx);    if(!NT_SUCCESS(status))    {        KdPrint((DRIVERNAME " - PsCreateSystemThread failed with error %08x/n", status));        goto cleanup;    }        status = ObReferenceObjectByHandle( RecoveryHandle,                                        SYNCHRONIZE,                                        NULL,                                        KernelMode,                                        (PVOID*)&pdx->RecoveryThread,                                        NULL );    ASSERT(NT_SUCCESS(status));    ZwClose(RecoveryHandle);        // Start polling    status = StartPolling(pdx);        if(!NT_SUCCESS(status))    {           KdPrint((DRIVERNAME " - StartPolling failed 0x%08x/n", status));        if(pdx->RecoveryThread)        {            // shutdown recovery thread            pdx->RecoveryExit = TRUE;             KeSetEvent(&pdx->RecoveryEvent, 0, FALSE);                // wait for polling thread to exit             KeWaitForSingleObject(pdx->RecoveryThread, Executive, KernelMode, FALSE, NULL);                 ObDereferenceObject(pdx->RecoveryThread);            pdx->RecoveryThread = NULL;        }                goto cleanup;    }    cleanup:    if(selurb) ExFreePool(selurb);    if(pcd   ) ExFreePool(pcd   );    // get rid of return codes like STATUS_PENDING    if(NT_SUCCESS(status))     {        return STATUS_SUCCESS;    }        return status;}
开发者ID:AustinWise,项目名称:Netduino-Micro-Framework,代码行数:101,


示例21: LfsFindLogRecord

//.........这里部分代码省略.........        //        //  We now have the log record desired.  If the Lsn in the        //  log record doesn't match the desired Lsn then the disk is        //  corrupt.        //        if ( Lsn.QuadPart != Lcb->RecordHeader->ThisLsn.QuadPart ) {                                                   //**** xxNeq( Lsn, Lcb->RecordHeader->ThisLsn )            ExRaiseStatus( STATUS_DISK_CORRUPT_ERROR );        }        //        //  Check that the length field isn't greater than the total available space        //  in the log file.        //        LogRecordLength = Lcb->RecordHeader->ClientDataLength + Lfcb->RecordHeaderLength;                              //**** xxFromUlong( Lcb->RecordHeader->ClientDataLength + Lfcb->RecordHeaderLength );        if ( LogRecordLength >= Lfcb->TotalAvailable ) {                                                               //**** xxGeq( LogRecordLength, Lfcb->TotalAvailable )            ExRaiseStatus( STATUS_DISK_CORRUPT_ERROR );        }        //        //  If the entire log record is on this log page, put a pointer to        //  the log record in the context block.        //        if (!FlagOn( Lcb->RecordHeader->Flags, LOG_RECORD_MULTI_PAGE )) {            //            //  If client size indicates that we have to go beyond the end of the current            //  page, we raise an error.            //            PageOffset = LfsLsnToPageOffset( Lfcb, Lsn );            if ((PageOffset + Lcb->RecordHeader->ClientDataLength + Lfcb->RecordHeaderLength)                > (ULONG)Lfcb->LogPageSize) {                ExRaiseStatus( STATUS_DISK_CORRUPT_ERROR );            }            Lcb->CurrentLogRecord = LfsAdd2Ptr( Lcb->RecordHeader, LFS_RECORD_HEADER_SIZE, PVOID );            Lcb->AuxilaryBuffer = FALSE;        //        //  Else we copy the data and remember that we allocated a buffer.        //        } else {            NewBuffer = FsRtlAllocatePool( PagedPool, Lcb->RecordHeader->ClientDataLength );            LfsCopyReadLogRecord( Lfcb,                                  Lcb->RecordHeader,                                  NewBuffer );            Lcb->CurrentLogRecord = NewBuffer;            Lcb->AuxilaryBuffer = TRUE;            NewBuffer = NULL;        }        //        //  We need to update the caller's parameters and the context block.        //        *RecordType = Lcb->RecordHeader->RecordType;        *TransactionId = Lcb->RecordHeader->TransactionId;        *UndoNextLsn = Lcb->RecordHeader->ClientUndoNextLsn;        *PreviousLsn = Lcb->RecordHeader->ClientPreviousLsn;        *Buffer = Lcb->CurrentLogRecord;        *BufferLength = Lcb->RecordHeader->ClientDataLength;    } __finally {        DebugUnwind( LfsFindLogRecord );        //        //  If an error occurred we unpin the record header and the log        //  We also free the buffer if allocated by us.        //        if (NewBuffer != NULL) {            ExFreePool( NewBuffer );        }        LfsDebugTrace(  0, Dbg, "Buffer Length -> %08lx/n", *BufferLength );        LfsDebugTrace(  0, Dbg, "Buffer        -> %08lx/n", *Buffer );        LfsDebugTrace( -1, Dbg, "LfsFindLogRecord:  Exit/n", 0 );    }    return;}
开发者ID:conioh,项目名称:os-design,代码行数:101,


示例22: OnWriteComplete

NTSTATUS OnWriteComplete(PDEVICE_OBJECT fdo, PIRP Irp, PRWCONTEXT ctx){       PIO_STACK_LOCATION stack;    NTSTATUS           status;    ULONG              length;    KIRQL              OldIrql;    ULONG              count;        PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;    status = Irp->IoStatus.Status;        if(NT_SUCCESS(status) && ctx->remain && !Irp->Cancel)    {        /* we have more to transfer */        length = ctx->remain;        if(length > pdx->maxtransfer)            length = pdx->maxtransfer;                UsbBuildInterruptOrBulkTransferRequest(&ctx->urb,                                               sizeof(_URB_BULK_OR_INTERRUPT_TRANSFER),                                               pdx->houtpipe,                                               ctx->data,                                               NULL,                                               length,                                               (USBD_TRANSFER_DIRECTION_OUT | USBD_SHORT_TRANSFER_OK),                                               NULL);        ctx->data += length;        ctx->remain -= length;                stack = IoGetNextIrpStackLocation(Irp);        stack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;        stack->Parameters.Others.Argument1 = (PVOID)&ctx->urb;        stack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;        IoSetCompletionRoutine(Irp,                                (PIO_COMPLETION_ROUTINE)OnWriteComplete,                               (PVOID) ctx,                               TRUE,                               TRUE,                               TRUE);        IoCallDriver(pdx->LowerDeviceObject, Irp);        return STATUS_MORE_PROCESSING_REQUIRED;    }        if(NT_SUCCESS(status))     {        Irp->IoStatus.Information = ctx->total;    }     else     {        KdPrint((DRIVERNAME " - finished with error!/n"));    }        ExFreePool(ctx);    StartNextPacket    ( &pdx->dqWrite, fdo    );    IoReleaseRemoveLock( &pdx->RemoveLock, Irp );        return STATUS_SUCCESS;}
开发者ID:AustinWise,项目名称:Netduino-Micro-Framework,代码行数:64,


示例23: t1394_IsochFreeResources

/* Source: WDK/src_5239/kmdf/1394/isochapi.c, line 679. */NTSTATUSt1394_IsochFreeResources(    PDEVICE_EXTENSION   deviceExtension, /* added for SLAyer *//*     IN WDFDEVICE   Device, *//*     IN WDFREQUEST  Request, */    /* IN */ HANDLE      hResource    ){    NTSTATUS              ntStatus            = STATUS_SUCCESS;/*     PDEVICE_EXTENSION     deviceExtension     = GetDeviceContext(Device); */    PIRB                  pIrb                = NULL;    PISOCH_RESOURCE_DATA  IsochResourceData   = NULL;    PLIST_ENTRY           listHead;    PLIST_ENTRY           thisEntry;/*     ENTER("t1394_IsochFreeResources"); *//*     TRACE(TL_TRACE, ("hResource = 0x%x/n", hResource)); */    pIrb = ExAllocatePoolWithTag(NonPagedPool, sizeof(IRB), POOLTAG_1394);    if (!pIrb) {/*         TRACE(TL_ERROR, ("Failed to allocate pIrb!/n")); */        ntStatus = STATUS_INSUFFICIENT_RESOURCES;        goto Exit_IsochFreeResources;    } // if    // remove this one from our list...	WdfSpinLockAcquire(deviceExtension->IsochResourceSpinLock);    listHead = &deviceExtension->IsochResourceData;    for(thisEntry = listHead->Flink;                    thisEntry != listHead;                    IsochResourceData = NULL, thisEntry = thisEntry->Flink)    {        IsochResourceData = CONTAINING_RECORD(thisEntry,                                              ISOCH_RESOURCE_DATA,                                              IsochResourceList);        if (IsochResourceData->hResource == hResource) {/*             TRACE(TL_TRACE, ("Removing hResource = 0x%x/n", hResource)); */            RemoveEntryList(&IsochResourceData->IsochResourceList);            ExFreePool(IsochResourceData);            break;        }    }	WdfSpinLockRelease(deviceExtension->IsochResourceSpinLock);    RtlZeroMemory (pIrb, sizeof (IRB));/*     pIrb->FunctionNumber = REQUEST_ISOCH_FREE_RESOURCES; */    pIrb->Flags = 0;/*     pIrb->u.IsochFreeResources.hResource = hResource; *//*     ntStatus = t1394_SubmitIrpSynch(deviceExtension->StackIoTarget, Request, pIrb); */    if (!NT_SUCCESS(ntStatus)) {/*         TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x/n", ntStatus)); */    }Exit_IsochFreeResources:    if (pIrb)    {        ExFreePool(pIrb);    }/*     EXIT("t1394_IsochFreeResources", ntStatus); */    return(ntStatus);} // t1394_IsochFreeResources
开发者ID:ChunHungLiu,项目名称:SLAyer,代码行数:76,


示例24: LspCleanupLock

//.........这里部分代码省略.........		}	}	for (i=0; i < maxConn; i++) {		if(!LspIsConnected(&tempLSS[i])) {			continue;		}		KDPrintM(DBG_LURN_TRACE, ("Con#%u/n", i));		cleaned++;		//	extract login information from the existing LSS.		LspBuildLoginInfo(LSS, &loginInfo);		status = LspLookupProtocol(loginInfo.HWType, loginInfo.HWVersion, &LSProto);		if(!NT_SUCCESS(status)) {			LspDisconnect(&tempLSS[i]);			KDPrintM(DBG_LURN_ERROR, ("Wrong hardware version./n"));			continue;		}		//	Log in with read-only access.		if (loginInfo.HWVersion == LANSCSIIDE_VERSION_2_5) {			loginInfo.UserID = MAKE_USER_ID(DEFAULT_USER_NUM, USER_PERMISSION_RO);		} else {			loginInfo.UserID &= 0x0000ffff;		}		status = LspLogin(						&tempLSS[i],						&loginInfo,						LSProto,						FALSE					);		if(!NT_SUCCESS(status)) {			KDPrintM(DBG_LURN_ERROR, ("LspLogin() failed. STATUS:0x%08x/n", status));			LspDisconnect(&tempLSS[i]);			ASSERT(FALSE);			continue;		}		//		//	Acquire the lock on the NDAS device.		//		pduDesc.Command = VENDOR_OP_SET_MUTEX;		status = LspVendorRequest(						&tempLSS[i],						&pduDesc,						&pduResponse						);		if(pduResponse != LANSCSI_RESPONSE_SUCCESS) {			KDPrintM(DBG_LURN_ERROR,	("Acquiring lock #%u denied by NDAS device/n", LockNo));		}		if(!NT_SUCCESS(status)) {			LspDisconnect(&tempLSS[i]);			KDPrintM(DBG_LURN_ERROR, ("LspVendorRequest() failed. STATUS=%08lx/n", status));			continue;		}		//		//	Release the lock on the NDAS device.		//		pduDesc.Command = VENDOR_OP_FREE_MUTEX;		status = LspVendorRequest(						&tempLSS[i],						&pduDesc,						&pduResponse						);		if(pduResponse != LANSCSI_RESPONSE_SUCCESS) {			KDPrintM(DBG_LURN_ERROR,	("Releasing lock #%u denied by NDAS device/n", LockNo));		}		if(!NT_SUCCESS(status)) {			LspDisconnect(&tempLSS[i]);			KDPrintM(DBG_LURN_ERROR, ("LspVendorRequest() failed. STATUS=%08lx/n", status));			continue;		}		//		//	Log out and disconnect.		//		LspLogout(			&tempLSS[i]			);		LspDisconnect(			&tempLSS[i]			);	}	KDPrintM(DBG_LURN_INFO, ("Cleaned #%u/n", cleaned));	ExFreePool(tempLSS);	return status;}
开发者ID:yzx65,项目名称:ndas4windows,代码行数:101,


示例25: MsfsCreateMailslot

/* Creates the server side */NTSTATUS DEFAULTAPIMsfsCreateMailslot(PDEVICE_OBJECT DeviceObject,                   PIRP Irp){    PEXTENDED_IO_STACK_LOCATION IoStack;    PFILE_OBJECT FileObject;    PMSFS_DEVICE_EXTENSION DeviceExtension;    PMSFS_FCB Fcb;    PMSFS_CCB Ccb;    KIRQL oldIrql;    PLIST_ENTRY current_entry;    PMSFS_FCB current = NULL;    PMAILSLOT_CREATE_PARAMETERS Buffer;    DPRINT("MsfsCreateMailslot(DeviceObject %p Irp %p)/n", DeviceObject, Irp);    IoStack = (PEXTENDED_IO_STACK_LOCATION)IoGetCurrentIrpStackLocation(Irp);    DeviceExtension = DeviceObject->DeviceExtension;    FileObject = IoStack->FileObject;    Buffer = IoStack->Parameters.CreateMailslot.Parameters;    DPRINT("Mailslot name: %wZ/n", &FileObject->FileName);    Fcb = ExAllocatePool(NonPagedPool, sizeof(MSFS_FCB));    if (Fcb == NULL)    {        Irp->IoStatus.Status = STATUS_NO_MEMORY;        Irp->IoStatus.Information = 0;        IoCompleteRequest(Irp, IO_NO_INCREMENT);        return STATUS_NO_MEMORY;    }    Fcb->Name.Length = FileObject->FileName.Length;    Fcb->Name.MaximumLength = Fcb->Name.Length + sizeof(UNICODE_NULL);    Fcb->Name.Buffer = ExAllocatePool(NonPagedPool, Fcb->Name.MaximumLength);    if (Fcb->Name.Buffer == NULL)    {        ExFreePool(Fcb);        Irp->IoStatus.Status = STATUS_NO_MEMORY;        Irp->IoStatus.Information = 0;        IoCompleteRequest(Irp, IO_NO_INCREMENT);        return STATUS_NO_MEMORY;    }    RtlCopyUnicodeString(&Fcb->Name, &FileObject->FileName);    Ccb = ExAllocatePool(NonPagedPool, sizeof(MSFS_CCB));    if (Ccb == NULL)    {        ExFreePool(Fcb->Name.Buffer);        ExFreePool(Fcb);        Irp->IoStatus.Status = STATUS_NO_MEMORY;        Irp->IoStatus.Information = 0;        IoCompleteRequest(Irp, IO_NO_INCREMENT);        return STATUS_NO_MEMORY;    }    Fcb->ReferenceCount = 0;    InitializeListHead(&Fcb->CcbListHead);    KeInitializeSpinLock(&Fcb->CcbListLock);    Fcb->MaxMessageSize = Buffer->MaximumMessageSize;    Fcb->MessageCount = 0;    Fcb->TimeOut = Buffer->ReadTimeout;    KeInitializeEvent(&Fcb->MessageEvent,                      NotificationEvent,                      FALSE);    InitializeListHead(&Fcb->MessageListHead);    KeInitializeSpinLock(&Fcb->MessageListLock);    KeLockMutex(&DeviceExtension->FcbListLock);    current_entry = DeviceExtension->FcbListHead.Flink;    while (current_entry != &DeviceExtension->FcbListHead)    {        current = CONTAINING_RECORD(current_entry,                                    MSFS_FCB,                                    FcbListEntry);        if (!RtlCompareUnicodeString(&Fcb->Name, &current->Name, TRUE))            break;        current_entry = current_entry->Flink;    }    if (current_entry != &DeviceExtension->FcbListHead)    {        ExFreePool(Fcb->Name.Buffer);        ExFreePool(Fcb);        ExFreePool(Ccb);//.........这里部分代码省略.........
开发者ID:hoangduit,项目名称:reactos,代码行数:101,


示例26: LspConnectEx

//.........这里部分代码省略.........			break;		}		status = LstransAddrTypeToTransType(DestAddr->Address[0].AddressType, &transport);		if(!NT_SUCCESS(status)) {			KDPrintM(DBG_PROTO_ERROR, ("Address type not supported. STATUS=%08lx/n", status));			break;		}		status = LstransQueryBindingDevices(transport, addrListLen, addrList, NULL);		if(!NT_SUCCESS(status)) {			KDPrintM(DBG_PROTO_ERROR, ("LstransQueryBindingDevices() failed. STATUS=%08lx/n", status));			break;		}		//		//	Validate binding address		//		if(BindAddr) {			status = LstransIsInAddressList(addrList, BindAddr, TRUE);			if(status == STATUS_OBJECT_NAME_NOT_FOUND) {				BindAddr = NULL;			} else if(!NT_SUCCESS(status)) {				break;			}		}		if(BindAddr2) {			status = LstransIsInAddressList(addrList, BindAddr2, TRUE);			if(status == STATUS_OBJECT_NAME_NOT_FOUND) {				BindAddr2 = NULL;			} else if(!NT_SUCCESS(status)) {				break;			}		}		//		//	Try bind addresses in order of BindAddr, BindAddr2, and any addresses available.		//		addrListPrioritized = LstranAllocateAddr(								LSTRANS_MAX_BINDADDR,								NULL);		if(!addrListPrioritized) {			status = STATUS_INSUFFICIENT_RESOURCES;			break;		}		idx_addr = 0;		addrListPrioritized->TAAddressCount = 0;		if(BindAddr) {			RtlCopyMemory(&addrListPrioritized->Address[idx_addr], BindAddr->Address, sizeof(struct  _AddrLstrans));			addrListPrioritized->TAAddressCount ++;			idx_addr ++;		}		if(BindAddr2) {			RtlCopyMemory(&addrListPrioritized->Address[idx_addr], BindAddr2->Address, sizeof(struct  _AddrLstrans));			addrListPrioritized->TAAddressCount ++;			idx_addr ++;		}		if(BindAnyAddress) {			ULONG	idx_bindaddr;			for(idx_bindaddr = 0; idx_bindaddr < (ULONG)addrList->TAAddressCount; idx_bindaddr ++) {				//				//	If an address has a valid length, copy into prioritized address list.				//	Set zero legnth to the same address as BindAddr and BindAddr2 in LstransIsInAddressList().				//				if(addrList->Address[idx_bindaddr].AddressLength) {					RtlCopyMemory(	&addrListPrioritized->Address[idx_addr],									&addrList->Address[idx_bindaddr],									sizeof(TA_LSTRANS_ADDRESS));					addrListPrioritized->TAAddressCount ++;					idx_addr ++;				}			}		}		//		//	Try connecting with prioritized binding address.		//		status = LspConnectBindAddrList(LSS, BoundAddr, DestAddr, addrListPrioritized);	} while(FALSE);	if(addrListPrioritized)		ExFreePool(addrListPrioritized);	if(addrList)		ExFreePool(addrList);	return status;}
开发者ID:yzx65,项目名称:ndas4windows,代码行数:101,


示例27: MsfsClose

NTSTATUS DEFAULTAPIMsfsClose(PDEVICE_OBJECT DeviceObject,          PIRP Irp){    PIO_STACK_LOCATION IoStack;    PFILE_OBJECT FileObject;    PMSFS_DEVICE_EXTENSION DeviceExtension;    PMSFS_FCB Fcb;    PMSFS_CCB Ccb;    PMSFS_MESSAGE Message;    KIRQL oldIrql;    DPRINT("MsfsClose(DeviceObject %p Irp %p)/n", DeviceObject, Irp);    IoStack = IoGetCurrentIrpStackLocation(Irp);    DeviceExtension = DeviceObject->DeviceExtension;    FileObject = IoStack->FileObject;    KeLockMutex(&DeviceExtension->FcbListLock);    if (DeviceExtension->FcbListHead.Flink == &DeviceExtension->FcbListHead)    {        KeUnlockMutex(&DeviceExtension->FcbListLock);        Irp->IoStatus.Status = STATUS_SUCCESS;        Irp->IoStatus.Information = 0;        IoCompleteRequest(Irp, IO_NO_INCREMENT);        return STATUS_SUCCESS;    }    Fcb = FileObject->FsContext;    Ccb = FileObject->FsContext2;    DPRINT("Mailslot name: %wZ/n", &Fcb->Name);    Fcb->ReferenceCount--;    if (Fcb->ServerCcb == Ccb)    {        /* delete all messages from message-list */        KeAcquireSpinLock(&Fcb->MessageListLock, &oldIrql);        while (Fcb->MessageListHead.Flink != &Fcb->MessageListHead)        {            Message = CONTAINING_RECORD(Fcb->MessageListHead.Flink,                                        MSFS_MESSAGE,                                        MessageListEntry);            RemoveEntryList(Fcb->MessageListHead.Flink);            ExFreePool(Message);        }        Fcb->MessageCount = 0;        KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql);        Fcb->ServerCcb = NULL;    }    KeAcquireSpinLock(&Fcb->CcbListLock, &oldIrql);    RemoveEntryList(&Ccb->CcbListEntry);    KeReleaseSpinLock(&Fcb->CcbListLock, oldIrql);    ExFreePool(Ccb);    FileObject->FsContext2 = NULL;    if (Fcb->ReferenceCount == 0)    {        DPRINT("ReferenceCount == 0: Deleting mailslot data/n");        RemoveEntryList(&Fcb->FcbListEntry);        ExFreePool(Fcb->Name.Buffer);        ExFreePool(Fcb);    }    KeUnlockMutex(&DeviceExtension->FcbListLock);    Irp->IoStatus.Status = STATUS_SUCCESS;    Irp->IoStatus.Information = 0;    IoCompleteRequest(Irp, IO_NO_INCREMENT);    return STATUS_SUCCESS;}
开发者ID:hoangduit,项目名称:reactos,代码行数:81,


示例28: rtMpCall

//.........这里部分代码省略......... * @param   pvUser1         User argument 1. * @param   pvUser2         User argument 2. * @param   enmCpuid        What to do / is idCpu valid. * @param   idCpu           Used if enmCpuid RT_NT_CPUID_SPECIFIC, otherwise ignored. */static int rtMpCall(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2, RT_NT_CPUID enmCpuid, RTCPUID idCpu){    PRTMPARGS pArgs;    KDPC     *paExecCpuDpcs;#if 0    /* KeFlushQueuedDpcs must be run at IRQL PASSIVE_LEVEL according to MSDN, but the     * driver verifier doesn't complain...     */    AssertMsg(KeGetCurrentIrql() == PASSIVE_LEVEL, ("%d != %d (PASSIVE_LEVEL)/n", KeGetCurrentIrql(), PASSIVE_LEVEL));#endif#ifdef IPRT_TARGET_NT4    KAFFINITY Mask;    /* g_pfnrtNt* are not present on NT anyway. */    return VERR_NOT_SUPPORTED;#else    KAFFINITY Mask = KeQueryActiveProcessors();#endif    /* KeFlushQueuedDpcs is not present in Windows 2000; import it dynamically so we can just fail this call. */    if (!g_pfnrtNtKeFlushQueuedDpcs)        return VERR_NOT_SUPPORTED;    pArgs = (PRTMPARGS)ExAllocatePoolWithTag(NonPagedPool, MAXIMUM_PROCESSORS*sizeof(KDPC) + sizeof(RTMPARGS), (ULONG)'RTMp');    if (!pArgs)        return VERR_NO_MEMORY;    pArgs->pfnWorker = pfnWorker;    pArgs->pvUser1   = pvUser1;    pArgs->pvUser2   = pvUser2;    pArgs->idCpu     = NIL_RTCPUID;    pArgs->cHits     = 0;    paExecCpuDpcs = (KDPC *)(pArgs + 1);    if (enmCpuid == RT_NT_CPUID_SPECIFIC)    {        KeInitializeDpc(&paExecCpuDpcs[0], rtmpNtDPCWrapper, pArgs);        KeSetImportanceDpc(&paExecCpuDpcs[0], HighImportance);        KeSetTargetProcessorDpc(&paExecCpuDpcs[0], (int)idCpu);    }    else    {        for (unsigned i = 0; i < MAXIMUM_PROCESSORS; i++)        {            KeInitializeDpc(&paExecCpuDpcs[i], rtmpNtDPCWrapper, pArgs);            KeSetImportanceDpc(&paExecCpuDpcs[i], HighImportance);            KeSetTargetProcessorDpc(&paExecCpuDpcs[i], i);        }    }    /* Raise the IRQL to DISPATCH_LEVEL so we can't be rescheduled to another cpu.     * KeInsertQueueDpc must also be executed at IRQL >= DISPATCH_LEVEL.     */    KIRQL oldIrql;    KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);    /*     * We cannot do other than assume a 1:1 relationship between the     * affinity mask and the process despite the warnings in the docs.     * If someone knows a better way to get this done, please let bird know.     */    if (enmCpuid == RT_NT_CPUID_SPECIFIC)    {        BOOLEAN ret = KeInsertQueueDpc(&paExecCpuDpcs[0], 0, 0);        Assert(ret);    }    else    {        unsigned iSelf = KeGetCurrentProcessorNumber();        for (unsigned i = 0; i < MAXIMUM_PROCESSORS; i++)        {            if (    (i != iSelf)                &&  (Mask & RT_BIT_64(i)))            {                BOOLEAN ret = KeInsertQueueDpc(&paExecCpuDpcs[i], 0, 0);                Assert(ret);            }        }        if (enmCpuid != RT_NT_CPUID_OTHERS)            pfnWorker(iSelf, pvUser1, pvUser2);    }    KeLowerIrql(oldIrql);    /* Flush all DPCs and wait for completion. (can take long!) */    /** @todo Consider changing this to an active wait using some atomic inc/dec     *  stuff (and check for the current cpu above in the specific case). */    g_pfnrtNtKeFlushQueuedDpcs();    ExFreePool(pArgs);    return VINF_SUCCESS;}
开发者ID:bayasist,项目名称:vbox,代码行数:101,


示例29: SeInitializeProcessAuditName

NTSTATUSNTAPISeInitializeProcessAuditName(IN PFILE_OBJECT FileObject,                             IN BOOLEAN DoAudit,                             OUT POBJECT_NAME_INFORMATION *AuditInfo){    OBJECT_NAME_INFORMATION LocalNameInfo;    POBJECT_NAME_INFORMATION ObjectNameInfo = NULL;    ULONG ReturnLength = 8;    NTSTATUS Status;    PAGED_CODE();    ASSERT(AuditInfo);    /* Check if we should do auditing */    if (DoAudit)    {        /* FIXME: TODO */    }    /* Now query the name */    Status = ObQueryNameString(FileObject,                               &LocalNameInfo,                               sizeof(LocalNameInfo),                               &ReturnLength);    if (((Status == STATUS_BUFFER_OVERFLOW) ||         (Status == STATUS_BUFFER_TOO_SMALL) ||         (Status == STATUS_INFO_LENGTH_MISMATCH)) &&        (ReturnLength != sizeof(LocalNameInfo)))    {        /* Allocate required size */        ObjectNameInfo = ExAllocatePoolWithTag(NonPagedPool,                                               ReturnLength,                                               TAG_SEPA);        if (ObjectNameInfo)        {            /* Query the name again */            Status = ObQueryNameString(FileObject,                                       ObjectNameInfo,                                       ReturnLength,                                       &ReturnLength);        }    }    /* Check if we got here due to failure */    if ((ObjectNameInfo) &&        (!(NT_SUCCESS(Status)) || (ReturnLength == sizeof(LocalNameInfo))))    {        /* First, free any buffer we might've allocated */        ASSERT(FALSE);        if (ObjectNameInfo) ExFreePool(ObjectNameInfo);        /* Now allocate a temporary one */        ReturnLength = sizeof(OBJECT_NAME_INFORMATION);        ObjectNameInfo = ExAllocatePoolWithTag(NonPagedPool,                                               sizeof(OBJECT_NAME_INFORMATION),                                               TAG_SEPA);        if (ObjectNameInfo)        {            /* Clear it */            RtlZeroMemory(ObjectNameInfo, ReturnLength);            Status = STATUS_SUCCESS;        }    }    /* Check if memory allocation failed */    if (!ObjectNameInfo) Status = STATUS_NO_MEMORY;    /* Return the audit name */    *AuditInfo = ObjectNameInfo;    /* Return status */    return Status;}
开发者ID:Moteesh,项目名称:reactos,代码行数:74,


示例30: SendDeviceIrp

VOID SendDeviceIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP SIrp ){    NTSTATUS                  ntStatus;    POWER_STATE               powState;    PDEVICE_EXTENSION         deviceExtension;    PIO_STACK_LOCATION        irpStack;    SYSTEM_POWER_STATE        systemState;    DEVICE_POWER_STATE        devState;    PPOWER_COMPLETION_CONTEXT powerContext;    irpStack = IoGetCurrentIrpStackLocation(SIrp);    systemState = irpStack->Parameters.Power.State.SystemState;    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;    FreeBT_DbgPrint(3, ("FBTUSB: SendDeviceIrp: Entered/n"));    // Read out the D-IRP out of the S->D mapping array captured in QueryCap's.    // we can choose deeper sleep states than our mapping but never choose    // lighter ones.    devState = deviceExtension->DeviceCapabilities.DeviceState[systemState];    powState.DeviceState = devState;    powerContext = (PPOWER_COMPLETION_CONTEXT) ExAllocatePool(NonPagedPool, sizeof(POWER_COMPLETION_CONTEXT));    if (!powerContext)	{        FreeBT_DbgPrint(1, ("FBTUSB: SendDeviceIrp: Failed to alloc memory for powerContext/n"));        ntStatus = STATUS_INSUFFICIENT_RESOURCES;    }    else	{        powerContext->DeviceObject = DeviceObject;        powerContext->SIrp = SIrp;        // in win2k PoRequestPowerIrp can take fdo or pdo.        ntStatus = PoRequestPowerIrp(                            deviceExtension->PhysicalDeviceObject,                            irpStack->MinorFunction,                            powState,                            (PREQUEST_POWER_COMPLETE)DevPoCompletionRoutine,                            powerContext,                            NULL);    }    if (!NT_SUCCESS(ntStatus))	{        if (powerContext)		{            ExFreePool(powerContext);        }        PoStartNextPowerIrp(SIrp);        SIrp->IoStatus.Status = ntStatus;        SIrp->IoStatus.Information = 0;        IoCompleteRequest(SIrp, IO_NO_INCREMENT);        FreeBT_DbgPrint(3, ("FBTUSB: SendDeviceIrp::"));        FreeBT_IoDecrement(deviceExtension);    }    FreeBT_DbgPrint(3, ("FBTUSB: SendDeviceIrp: Leaving/n"));}
开发者ID:HBelusca,项目名称:NasuTek-Odyssey,代码行数:67,



注:本文中的ExFreePool函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ ExFreePoolWithTag函数代码示例
C++ ExAllocatePoolWithTag函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。