亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? rw.c

?? 這是一個(gè)開(kāi)放源代碼的與WINNT/WIN2K/WIN2003兼容的操作系統(tǒng)
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
				Status = STATUS_PENDING;
				goto done;
			}
		}
	}

	while (1)
	{
		Buffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
		Information = Irp->IoStatus.Information;
		Length = IoGetCurrentIrpStackLocation(Irp)->Parameters.Read.Length;
		ASSERT (Information <= Length);
		Buffer = (PVOID)((ULONG_PTR)Buffer + Information);
		Length -= Information;
		Status = STATUS_SUCCESS;

		while (1)
		{
			if (Ccb->ReadDataAvailable == 0)
			{
				if (Ccb->PipeState == FILE_PIPE_CONNECTED_STATE)
				{
					ASSERT(Ccb->OtherSide != NULL);
					KeSetEvent(&Ccb->OtherSide->WriteEvent, IO_NO_INCREMENT, FALSE);
				}
				if (Information > 0 &&
					(Ccb->Fcb->ReadMode != FILE_PIPE_BYTE_STREAM_MODE ||
					Ccb->PipeState != FILE_PIPE_CONNECTED_STATE))
				{
					break;
				}
				if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE)
				{
					DPRINT("PipeState: %x\n", Ccb->PipeState);
					Status = STATUS_PIPE_BROKEN;
					break;
				}
				ExReleaseFastMutex(&Ccb->DataListLock);
				if (IoIsOperationSynchronous(Irp))
				{
					/* Wait for ReadEvent to become signaled */

					DPRINT("Waiting for readable data (%wZ)\n", &Ccb->Fcb->PipeName);
					Status = KeWaitForSingleObject(&Ccb->ReadEvent,
						UserRequest,
						KernelMode,
						FALSE,
						NULL);
					DPRINT("Finished waiting (%wZ)! Status: %x\n", &Ccb->Fcb->PipeName, Status);
					ExAcquireFastMutex(&Ccb->DataListLock);
				}
				else
				{
					Context = (PNPFS_CONTEXT)&Irp->Tail.Overlay.DriverContext;

					Context->WaitEvent = &Ccb->ReadEvent;
					Status = NpfsAddWaitingReadWriteRequest(DeviceObject, Irp);

					if (NT_SUCCESS(Status))
					{
						Status = STATUS_PENDING;
					}
					ExAcquireFastMutex(&Ccb->DataListLock);
					break;
				}
			}
			ASSERT(IoGetCurrentIrpStackLocation(Irp)->FileObject != NULL);
			if (Ccb->Fcb->ReadMode == FILE_PIPE_BYTE_STREAM_MODE)
			{
				DPRINT("Byte stream mode\n");
				/* Byte stream mode */
				while (Length > 0 && Ccb->ReadDataAvailable > 0)
				{
					CopyLength = min(Ccb->ReadDataAvailable, Length);
					if ((ULONG_PTR)Ccb->ReadPtr + CopyLength <= (ULONG_PTR)Ccb->Data + Ccb->MaxDataLength)
					{
						memcpy(Buffer, Ccb->ReadPtr, CopyLength);
						Ccb->ReadPtr = (PVOID)((ULONG_PTR)Ccb->ReadPtr + CopyLength);
						if (Ccb->ReadPtr == (PVOID)((ULONG_PTR)Ccb->Data + Ccb->MaxDataLength))
						{
							Ccb->ReadPtr = Ccb->Data;
						}
					}
					else
					{
						TempLength = (ULONG)((ULONG_PTR)Ccb->Data + Ccb->MaxDataLength - (ULONG_PTR)Ccb->ReadPtr);
						memcpy(Buffer, Ccb->ReadPtr, TempLength);
						memcpy((PVOID)((ULONG_PTR)Buffer + TempLength), Ccb->Data, CopyLength - TempLength);
						Ccb->ReadPtr = (PVOID)((ULONG_PTR)Ccb->Data + CopyLength - TempLength);
					}

					Buffer = (PVOID)((ULONG_PTR)Buffer + CopyLength);
					Length -= CopyLength;
					Information += CopyLength;

					Ccb->ReadDataAvailable -= CopyLength;
					Ccb->WriteQuotaAvailable += CopyLength;
				}

				if (Length == 0)
				{
					if (Ccb->PipeState == FILE_PIPE_CONNECTED_STATE)
					{
						KeSetEvent(&Ccb->OtherSide->WriteEvent, IO_NO_INCREMENT, FALSE);
					}
					KeResetEvent(&Ccb->ReadEvent);
					break;
				}
			}
			else
			{
				DPRINT("Message mode\n");

				/* Message mode */
				if (Ccb->ReadDataAvailable)
				{
					/* Truncate the message if the receive buffer is too small */
					CopyLength = min(Ccb->ReadDataAvailable, Length);
					memcpy(Buffer, Ccb->Data, CopyLength);

#ifndef NDEBUG
					DPRINT("Length %d Buffer %x\n",CopyLength,Buffer);
					HexDump((PUCHAR)Buffer, CopyLength);
#endif

					Information = CopyLength;

					if (Ccb->ReadDataAvailable > Length)
					{
						memmove(Ccb->Data, (PVOID)((ULONG_PTR)Ccb->Data + Length),
							Ccb->ReadDataAvailable - Length);
						Ccb->ReadDataAvailable -= Length;
						Status = STATUS_MORE_ENTRIES;
					}
					else
					{
						KeResetEvent(&Ccb->ReadEvent);
						if (Ccb->PipeState == FILE_PIPE_CONNECTED_STATE)
						{
							KeSetEvent(&Ccb->OtherSide->WriteEvent, IO_NO_INCREMENT, FALSE);
						}
						Ccb->ReadDataAvailable = 0;
						Ccb->WriteQuotaAvailable = Ccb->MaxDataLength;
					}
				}

				if (Information > 0)
				{
					break;
				}
			}
		}
		Irp->IoStatus.Information = Information;
		Irp->IoStatus.Status = Status;

		ASSERT(IoGetCurrentIrpStackLocation(Irp)->FileObject != NULL);

		if (IoIsOperationSynchronous(Irp))
		{
			RemoveEntryList(&Context->ListEntry);
			if (!IsListEmpty(&Ccb->ReadRequestListHead))
			{
				Context = CONTAINING_RECORD(Ccb->ReadRequestListHead.Flink, NPFS_CONTEXT, ListEntry);
				KeSetEvent(Context->WaitEvent, IO_NO_INCREMENT, FALSE);
			}
			ExReleaseFastMutex(&Ccb->DataListLock);
			IoCompleteRequest(Irp, IO_NO_INCREMENT);

			DPRINT("NpfsRead done (Status %lx)\n", Status);
			return Status;
		}
		else
		{
			if (IsOriginalRequest)
			{
				IsOriginalRequest = FALSE;
				OriginalStatus = Status;
			}
			if (Status == STATUS_PENDING)
			{
				ExReleaseFastMutex(&Ccb->DataListLock);
				DPRINT("NpfsRead done (Status %lx)\n", OriginalStatus);
				return OriginalStatus;
			}
			RemoveEntryList(&Context->ListEntry);
			IoCompleteRequest(Irp, IO_NO_INCREMENT);
			if (IsListEmpty(&Ccb->ReadRequestListHead))
			{
				ExReleaseFastMutex(&Ccb->DataListLock);
				DPRINT("NpfsRead done (Status %lx)\n", OriginalStatus);
				return OriginalStatus;
			}
			Context = CONTAINING_RECORD(Ccb->ReadRequestListHead.Flink, NPFS_CONTEXT, ListEntry);
			Irp = CONTAINING_RECORD(Context, IRP, Tail.Overlay.DriverContext);
		}
	}

done:
	Irp->IoStatus.Status = Status;

	if (Status != STATUS_PENDING)
	{
		IoCompleteRequest(Irp, IO_NO_INCREMENT);
	}
	DPRINT("NpfsRead done (Status %lx)\n", Status);

	return Status;
}

NTSTATUS STDCALL
NpfsWrite(PDEVICE_OBJECT DeviceObject,
		  PIRP Irp)
{
	PIO_STACK_LOCATION IoStack;
	PFILE_OBJECT FileObject;
	PNPFS_FCB Fcb = NULL;
	PNPFS_CCB Ccb = NULL;
	PNPFS_CCB ReaderCcb;
	PUCHAR Buffer;
	NTSTATUS Status = STATUS_SUCCESS;
	ULONG Length;
	ULONG Offset;
	ULONG Information;
	ULONG CopyLength;
	ULONG TempLength;

	DPRINT("NpfsWrite()\n");

	IoStack = IoGetCurrentIrpStackLocation(Irp);
	FileObject = IoStack->FileObject;
	DPRINT("FileObject %p\n", FileObject);
	DPRINT("Pipe name %wZ\n", &FileObject->FileName);

	Ccb = FileObject->FsContext2;
	ReaderCcb = Ccb->OtherSide;
	Fcb = Ccb->Fcb;

	Length = IoStack->Parameters.Write.Length;
	Offset = IoStack->Parameters.Write.ByteOffset.u.LowPart;
	Information = 0;

	if (Irp->MdlAddress == NULL)
	{
		DPRINT("Irp->MdlAddress == NULL\n");
		Status = STATUS_UNSUCCESSFUL;
		Length = 0;
		goto done;
	}

	if (ReaderCcb == NULL)
	{
		DPRINT("Pipe is NOT connected!\n");
		if (Ccb->PipeState == FILE_PIPE_LISTENING_STATE)
			Status = STATUS_PIPE_LISTENING;
		else if (Ccb->PipeState == FILE_PIPE_DISCONNECTED_STATE)
			Status = STATUS_PIPE_DISCONNECTED;
		else
			Status = STATUS_UNSUCCESSFUL;
		Length = 0;
		goto done;
	}

	if (ReaderCcb->Data == NULL)
	{
		DPRINT("Pipe is NOT writable!\n");
		Status = STATUS_UNSUCCESSFUL;
		Length = 0;
		goto done;
	}

	Status = STATUS_SUCCESS;
	Buffer = MmGetSystemAddressForMdl (Irp->MdlAddress);

	ExAcquireFastMutex(&ReaderCcb->DataListLock);
#ifndef NDEBUG
	DPRINT("Length %d Buffer %x Offset %x\n",Length,Buffer,Offset);
	HexDump(Buffer, Length);
#endif

	while(1)
	{
		if (ReaderCcb->WriteQuotaAvailable == 0)
		{
			KeSetEvent(&ReaderCcb->ReadEvent, IO_NO_INCREMENT, FALSE);
			if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE)
			{
				Status = STATUS_PIPE_BROKEN;
				ExReleaseFastMutex(&ReaderCcb->DataListLock);
				goto done;
			}
			ExReleaseFastMutex(&ReaderCcb->DataListLock);

			DPRINT("Waiting for buffer space (%S)\n", Fcb->PipeName.Buffer);
			Status = KeWaitForSingleObject(&Ccb->WriteEvent,
				UserRequest,
				KernelMode,
				FALSE,
				NULL);
			DPRINT("Finished waiting (%S)! Status: %x\n", Fcb->PipeName.Buffer, Status);

			/*
			* It's possible that the event was signaled because the
			* other side of pipe was closed.
			*/
			if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE)
			{
				DPRINT("PipeState: %x\n", Ccb->PipeState);
				Status = STATUS_PIPE_BROKEN;
				// ExReleaseFastMutex(&ReaderCcb->DataListLock);
				goto done;
			}

			ExAcquireFastMutex(&ReaderCcb->DataListLock);
		}

		if (Fcb->WriteMode == FILE_PIPE_BYTE_STREAM_MODE)
		{
			DPRINT("Byte stream mode\n");
			while (Length > 0 && ReaderCcb->WriteQuotaAvailable > 0)
			{
				CopyLength = min(Length, ReaderCcb->WriteQuotaAvailable);
				if ((ULONG_PTR)ReaderCcb->WritePtr + CopyLength <= (ULONG_PTR)ReaderCcb->Data + ReaderCcb->MaxDataLength)
				{
					memcpy(ReaderCcb->WritePtr, Buffer, CopyLength);
					ReaderCcb->WritePtr = (PVOID)((ULONG_PTR)ReaderCcb->WritePtr + CopyLength);
					if ((ULONG_PTR)ReaderCcb->WritePtr == (ULONG_PTR)ReaderCcb->Data + ReaderCcb->MaxDataLength)
					{
						ReaderCcb->WritePtr = ReaderCcb->Data;
					}
				}
				else
				{
					TempLength = (ULONG)((ULONG_PTR)ReaderCcb->Data + ReaderCcb->MaxDataLength - (ULONG_PTR)ReaderCcb->WritePtr);
					memcpy(ReaderCcb->WritePtr, Buffer, TempLength);
					memcpy(ReaderCcb->Data, Buffer + TempLength, CopyLength - TempLength);
					ReaderCcb->WritePtr = (PVOID)((ULONG_PTR)ReaderCcb->Data + CopyLength - TempLength);
				}

				Buffer += CopyLength;
				Length -= CopyLength;
				Information += CopyLength;

				ReaderCcb->ReadDataAvailable += CopyLength;
				ReaderCcb->WriteQuotaAvailable -= CopyLength;
			}

			if (Length == 0)
			{
				KeSetEvent(&ReaderCcb->ReadEvent, IO_NO_INCREMENT, FALSE);
				KeResetEvent(&Ccb->WriteEvent);
				break;
			}
		}
		else
		{
			DPRINT("Message mode\n");
			if (Length > 0)
			{
				CopyLength = min(Length, ReaderCcb->WriteQuotaAvailable);
				memcpy(ReaderCcb->Data, Buffer, CopyLength);

				Information = CopyLength;
				ReaderCcb->ReadDataAvailable = CopyLength;
				ReaderCcb->WriteQuotaAvailable = 0;
			}

			if (Information > 0)
			{
				KeSetEvent(&ReaderCcb->ReadEvent, IO_NO_INCREMENT, FALSE);
				KeResetEvent(&Ccb->WriteEvent);
				break;
			}
		}
	}

	ExReleaseFastMutex(&ReaderCcb->DataListLock);

done:
	Irp->IoStatus.Status = Status;
	Irp->IoStatus.Information = Information;

	IoCompleteRequest(Irp, IO_NO_INCREMENT);

	DPRINT("NpfsWrite done (Status %lx)\n", Status);

	return Status;
}

/* EOF */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
粉嫩av一区二区三区粉嫩| 伦理电影国产精品| 国产精品自拍三区| 欧美三级午夜理伦三级中视频| 国产欧美一区二区精品秋霞影院 | 中文字幕一区二区日韩精品绯色| 免费成人在线影院| 欧美无人高清视频在线观看| 国产精品剧情在线亚洲| 精品一区二区三区在线观看| 欧美久久婷婷综合色| 亚洲人一二三区| 丰满亚洲少妇av| 日韩免费观看高清完整版| 亚洲一区二区美女| 91啪九色porn原创视频在线观看| 国产亚洲综合在线| 久久国产麻豆精品| 678五月天丁香亚洲综合网| 亚洲国产日韩在线一区模特| 一本到不卡免费一区二区| 国产精品毛片久久久久久| 国产精品123区| 久久精品欧美一区二区三区麻豆| 精品亚洲国产成人av制服丝袜| 6080日韩午夜伦伦午夜伦| 一区二区三区精品在线| 国产大陆亚洲精品国产| 欧美在线观看你懂的| 中文字幕一区二区三中文字幕| 国产一区在线视频| 精品卡一卡二卡三卡四在线| 老司机精品视频在线| 日韩一区二区中文字幕| 日韩电影在线观看网站| 欧美电影一区二区三区| 亚洲愉拍自拍另类高清精品| 91国在线观看| 一区二区三区免费在线观看| 在线看国产日韩| 亚洲愉拍自拍另类高清精品| 日本久久电影网| 亚洲最新在线观看| 欧美性大战xxxxx久久久| 亚洲成人激情社区| 7777精品伊人久久久大香线蕉 | 国产精品一区二区在线观看不卡| 国产精品伦理在线| 久久久久久久综合日本| 国产曰批免费观看久久久| 久久久激情视频| 国产a区久久久| 亚洲欧美视频在线观看| 在线观看精品一区| 九九视频精品免费| 欧美精品黑人性xxxx| 蜜桃精品视频在线观看| 日韩手机在线导航| 国产裸体歌舞团一区二区| 中文字幕av在线一区二区三区| 99久久久国产精品免费蜜臀| 一区二区免费在线播放| 欧美一区二区三区日韩| 国模一区二区三区白浆| 国产精品你懂的在线| 一本大道av伊人久久综合| 亚洲成人av电影在线| 欧美www视频| 成人毛片视频在线观看| 亚洲激情男女视频| 3d成人动漫网站| 国产激情偷乱视频一区二区三区| 中文字幕五月欧美| 欧美日韩精品电影| 国产一区二区福利视频| 亚洲欧洲精品成人久久奇米网| 欧美性xxxxxx少妇| 国模一区二区三区白浆| 亚洲精品国产无天堂网2021| 制服丝袜在线91| 国产98色在线|日韩| 一二三区精品视频| 欧美mv和日韩mv的网站| av成人免费在线观看| 婷婷国产在线综合| 国产丝袜欧美中文另类| 欧美在线免费视屏| 久草在线在线精品观看| 亚洲日穴在线视频| 日韩欧美亚洲国产另类| 91免费精品国自产拍在线不卡| 日韩中文字幕区一区有砖一区 | 91精品国产综合久久久久久久| 国产精品自产自拍| 亚洲3atv精品一区二区三区| 久久久久国产一区二区三区四区 | 粉嫩av一区二区三区| 天天影视涩香欲综合网 | 欧美aⅴ一区二区三区视频| 久久久综合激的五月天| 欧美视频一区二区在线观看| 国产大陆亚洲精品国产| 日本在线观看不卡视频| 综合久久久久久| 精品国产乱码91久久久久久网站| 色狠狠一区二区三区香蕉| 国内精品久久久久影院色| 一区二区三区四区乱视频| 久久久91精品国产一区二区三区| 欧美日韩三级一区| 91在线视频免费观看| 国产一区在线观看视频| 午夜精品aaa| 亚洲欧洲制服丝袜| 国产网站一区二区| 日韩女优电影在线观看| 精品视频999| 99r国产精品| 国产精品18久久久久久久网站| 日本午夜精品视频在线观看| 亚洲精品高清在线| 国产精品麻豆一区二区| 久久午夜电影网| 91精品国产入口在线| 在线免费不卡视频| 93久久精品日日躁夜夜躁欧美| 国产乱码精品一区二区三区忘忧草| 亚洲高清在线视频| 一区二区在线电影| 亚洲三级免费观看| 国产精品久久久久久久久免费桃花 | 欧美一区二区精美| 精品视频在线免费看| 91小视频免费观看| 成人开心网精品视频| 国产一区二区不卡老阿姨| 麻豆国产欧美一区二区三区| 午夜精品久久久久久久久| 一区二区三区免费网站| 亚洲精品菠萝久久久久久久| 国产精品久久久久桃色tv| 欧美激情一二三区| 久久久99精品免费观看| 久久日韩粉嫩一区二区三区| 精品蜜桃在线看| 精品日韩欧美在线| 精品福利一二区| 精品成人一区二区三区| 欧美videos大乳护士334| 欧美成人艳星乳罩| 精品国精品国产| 精品国产网站在线观看| 精品久久久久久亚洲综合网| 欧美哺乳videos| 久久综合999| 久久精品亚洲精品国产欧美kt∨| 久久精品这里都是精品| 欧美国产激情一区二区三区蜜月| 国产午夜亚洲精品不卡| 中文子幕无线码一区tr| 国产精品色眯眯| 亚洲视频一二三| 一区二区日韩电影| 婷婷国产v国产偷v亚洲高清| 日本中文字幕一区二区视频 | 亚洲午夜在线观看视频在线| 亚洲午夜一区二区三区| 日日欢夜夜爽一区| 久久国产综合精品| 国产成人亚洲综合a∨猫咪| 成人免费视频国产在线观看| eeuss国产一区二区三区| 一本久久a久久精品亚洲| 欧美日韩国产综合草草| 日韩一区二区电影| 久久久欧美精品sm网站| 国产精品久久久久久久久快鸭| 伊人色综合久久天天人手人婷| 亚洲成国产人片在线观看| 免费国产亚洲视频| 国产精品香蕉一区二区三区| 成人h版在线观看| 精品视频免费看| 欧美成人vps| 国产精品美女久久久久高潮| 亚洲最新在线观看| 美女视频黄 久久| 成人国产精品免费网站| 精品视频色一区| 久久久精品tv| 一区二区三区四区精品在线视频| 男男视频亚洲欧美| 高清在线成人网| 欧美日韩视频一区二区| 欧美精品一区二区三区蜜臀 | 国产午夜精品一区二区三区嫩草| 亚洲欧洲在线观看av| 石原莉奈一区二区三区在线观看| 韩国欧美国产一区| 在线免费不卡视频|