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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? rw.c

?? ReactOS是一些高手根據(jù)Windows XP的內(nèi)核編寫出的類XP。內(nèi)核實(shí)現(xiàn)機(jī)理和API函數(shù)調(diào)用幾乎相同。甚至可以兼容XP的程序。喜歡研究系統(tǒng)內(nèi)核的人可以看一看。
?? C
?? 第 1 頁 / 共 2 頁
字號(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 */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品久久久久影视| 色综合咪咪久久| 日韩av网站在线观看| 一区二区三区在线免费观看| 亚洲欧美一区二区久久| 国产精品成人免费精品自在线观看| 精品国产乱码久久久久久1区2区 | 国产亚洲女人久久久久毛片| 日韩免费视频一区| 欧美一级精品在线| 欧美大肚乱孕交hd孕妇| 国内偷窥港台综合视频在线播放| 欧美一区二区三区视频在线| 日韩欧美色电影| 久久久久国色av免费看影院| 欧美国产精品专区| 亚洲精品欧美专区| 日韩成人一区二区三区在线观看| 麻豆精品一区二区av白丝在线| 国产一区在线精品| a4yy欧美一区二区三区| 国产成人综合在线播放| 色香色香欲天天天影视综合网 | 亚洲一本大道在线| 日韩主播视频在线| 国产成人在线看| 欧美伊人久久久久久久久影院| 666欧美在线视频| 中文字幕欧美国产| 亚洲大片一区二区三区| 国产综合成人久久大片91| 97精品电影院| 日韩精品中文字幕一区| 综合在线观看色| 热久久免费视频| 91色婷婷久久久久合中文| 91 com成人网| 亚洲免费观看高清完整| 日本欧美一区二区| aaa国产一区| 久久久久国产成人精品亚洲午夜| 国产1区2区3区精品美女| 欧洲一区二区三区在线| 久久嫩草精品久久久精品| 亚洲一区在线视频观看| 国产成人在线色| 午夜a成v人精品| 99精品一区二区| 久久人人爽人人爽| 毛片不卡一区二区| 欧美伊人精品成人久久综合97| 国产亚洲欧美日韩在线一区| 水蜜桃久久夜色精品一区的特点| 91亚洲资源网| 国产精品久久久久久一区二区三区| 奇米在线7777在线精品| 日本韩国一区二区| 国产精品久久毛片av大全日韩| 久久精品国产亚洲a| 欧美日韩免费不卡视频一区二区三区| 亚洲国产精品99久久久久久久久| 精品一区二区日韩| 欧美一级黄色片| 青青草国产成人av片免费| 欧美日韩成人综合天天影院 | 久久精品视频免费| 久久精品国产99久久6| 色成年激情久久综合| 中文字幕一区在线观看视频| 国产成人av电影| 中文字幕免费观看一区| 成人一区二区三区在线观看| 国产精品私人自拍| 成人黄色一级视频| 久久精品亚洲精品国产欧美| 国产激情视频一区二区三区欧美 | 激情综合一区二区三区| 91精品国产一区二区三区| 午夜精品久久久久久久久久 | 久久久久久一二三区| 毛片基地黄久久久久久天堂| 精品电影一区二区三区| 国产精品一区二区久激情瑜伽| 久久综合久久综合久久综合| 国产乱码一区二区三区| 亚洲乱码中文字幕| 国产精品人妖ts系列视频| 国产成人精品综合在线观看| 国产精品入口麻豆九色| 9色porny自拍视频一区二区| 亚洲精品国产a久久久久久 | 九一久久久久久| 国产区在线观看成人精品| 99在线精品一区二区三区| 亚洲夂夂婷婷色拍ww47| 欧美三电影在线| 美洲天堂一区二卡三卡四卡视频| 欧美mv日韩mv| 不卡av在线免费观看| 一区二区在线电影| 精品久久久久99| 99精品热视频| 美洲天堂一区二卡三卡四卡视频 | 91麻豆蜜桃一区二区三区| 亚洲高清免费一级二级三级| 欧美一区二区久久| 高清成人在线观看| 亚洲欧美在线视频观看| 欧美精品777| 国产69精品久久99不卡| 亚洲超碰精品一区二区| 久久久久久久久久久99999| 91视频观看视频| 国产综合久久久久久鬼色 | 天天做天天摸天天爽国产一区| 精品日韩在线观看| 日本韩国欧美国产| 国产在线不卡一区| 亚洲一区二区三区美女| 国产欧美一区二区在线观看| 7799精品视频| 99精品视频在线免费观看| 看电视剧不卡顿的网站| 一区二区三区91| 国产精品嫩草99a| 久久日韩粉嫩一区二区三区| 色婷婷综合久色| 中文字幕电影一区| 日韩欧美一区中文| 欧美日韩一区国产| 色综合一个色综合| 成人av在线播放网站| 韩国精品一区二区| 蜜桃视频一区二区三区| 亚洲在线免费播放| 亚洲欧美日韩国产综合| 国产欧美精品一区二区三区四区 | 国产成+人+日韩+欧美+亚洲| 理论片日本一区| 午夜久久久久久电影| 一区二区三区四区五区视频在线观看| 久久久久一区二区三区四区| 欧美不卡一区二区| 欧美一区二区成人6969| 欧美日韩国产三级| 欧美日韩国产区一| 欧美性三三影院| 日本高清视频一区二区| 91免费版在线| 在线亚洲+欧美+日本专区| 色综合久久88色综合天天免费| 99久久99久久精品国产片果冻| 不卡一区二区三区四区| www.亚洲色图.com| 日本丶国产丶欧美色综合| 91久久国产最好的精华液| 色综合色综合色综合色综合色综合| 91麻豆精品视频| 欧美日韩综合在线| 欧美一区二区在线免费播放| 欧美一区二区私人影院日本| 日韩一卡二卡三卡国产欧美| 久久欧美中文字幕| 成人免费在线观看入口| 亚洲一二三区在线观看| 日本美女视频一区二区| 日本欧美一区二区三区| 精品国产三级a在线观看| 久久久一区二区| 日本一区二区成人| 亚洲一区二区三区在线看| 日韩在线观看一区二区| 国产一区久久久| 91丝袜美女网| 欧美久久免费观看| 精品精品国产高清a毛片牛牛| 亚洲国产成人午夜在线一区| 艳妇臀荡乳欲伦亚洲一区| 日韩成人一区二区| 懂色av一区二区三区免费观看| 色综合久久综合网| 在线不卡欧美精品一区二区三区| 久久综合九色综合97婷婷| 亚洲视频在线一区观看| 美女一区二区三区在线观看| 成人综合婷婷国产精品久久 | 亚洲精品五月天| 秋霞午夜鲁丝一区二区老狼| 韩国毛片一区二区三区| 色哟哟一区二区| 色老汉一区二区三区| 日韩一级视频免费观看在线| 中文字幕在线播放不卡一区| 久久国产乱子精品免费女| 91免费版pro下载短视频| 久久影院午夜论| 日韩高清不卡一区二区三区| 91在线视频观看| 久久久av毛片精品| 欧美videos中文字幕|