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

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

?? alertable_io.cpp

?? 《C/C++程序員實用大全》的配套程序代碼
?? CPP
字號:
#include "CmnHdr.H"
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "Resource.H"

//////////////////////////////////////////////////////////////////////
HANDLE CreateNewCompletionPort(DWORD cSimultaneousClients){
	return(CreateIoCompletionPort(INVALID_HANDLE_VALUE,
		NULL, 0, cSimultaneousClients));
}

BOOL AssociateDeviceWithCompletionPort(
	HANDLE hCompPort, HANDLE hDevice, DWORD dwCompKey){
	HANDLE h = CreateIoCompletionPort(hDevice,
		hCompPort, dwCompKey, 0);
	return(h == hCompPort);
}

//////////////////////////////////////////////////////////////////////

static BOOL PrepareDstFile(LPCTSTR pszFileSrc,
						   LPCTSTR pszFileDst,
						   PHANDLE phFileSrc, PHANDLE phFileDst,
						   PULARGE_INTEGER pulFileSize, DWORD dwPageSize) {

	ULARGE_INTEGER ulFileSizeDst;
	DWORD dwError;
	BOOL fOk = FALSE;

	_try{
		//Open the existing source file for input.
		*phFileSrc = CreateFile(pszFileSrc, GENERIC_READ,
			FILE_SHARE_READ, NULL, OPEN_EXISTING,
			FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED,
			NULL);

		if (*phFileSrc == INVALID_HANDLE_VALUE)
			_leave;

		//Create the new destination file for output.
		*phFileDst = CreateFile(pszFileDst, GENERIC_WRITE,
			0, NULL, CREATE_ALWAYS,
			FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED,
			*phFileSrc);
		if (*phFileDst == INVALID_HANDLE_VALUE)
			_leave;

		//Get the size of the original file.
		pulFileSize->LowPart = GetFileSize(*phFileSrc,
			&pulFileSize->HighPart);

		//Round up the sourc file size 
		//to an even multiple of pages.
		ulFileSizeDst.QuadPart = (pulFileSize->QuadPart + 
			dwPageSize - 1) & ~(dwPageSize - 1);

		//Force the destination file to the size needed.
		dwError = SetFilePointer(*phFileDst,
			ulFileSizeDst.LowPart,
			(PLONG)ulFileSizeDst.HighPart, FILE_BEGIN);
		if ((dwError == 0xffffffff) &&
			(GetLastError() != NO_ERROR))
			_leave;

		if (!SetEndOfFile(*phFileDst))
			_leave;

		fOk = TRUE;		//We did everything successfully.
	}
	_finally {
		//If anything failed, clean up entirely.
		if (!fOk) {
			if (*phFileSrc != INVALID_HANDLE_VALUE){
				CloseHandle(*phFileSrc);
				*phFileSrc = INVALID_HANDLE_VALUE;
			}
			if (*phFileSrc != INVALID_HANDLE_VALUE){
				CloseHandle(*phFileDst);
				*phFileDst = INVALID_HANDLE_VALUE;
			}
		}
	}
	return(fOk);
}

//////////////////////////////////////////////////////////////////////

static void CopyCleanup(LPCTSTR pszFileDst, HANDLE hFileSrc,
						HANDLE hFileDst, PULARGE_INTEGER pulFileSize){

	//Close the source and destination files.
	CloseHandle(hFileDst);
	CloseHandle(hFileSrc);
	
	//We need another handle to the destination file that is 
	//opened without FILE_FLAG_NO_BUFFERING. This allows us
	//to set the end-of-file marker to a position that is 
	//not sector-aligned.
	hFileDst = CreateFile(pszFileDst, GENERIC_WRITE,
	FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
	OPEN_EXISTING, 0, NULL);

	if (hFileDst != INVALID_HANDLE_VALUE){

		//Set the destination file's size to the size of the 
		//source file, in case the size of the source file was 
		//not a multiple of the page size.
		SetFilePointer(hFileDst, pulFileSize->LowPart, 
			(PLONG)pulFileSize->HighPart, FILE_BEGIN);
		SetEndOfFile(hFileDst);
		CloseHandle(hFileDst);
	}
}

//////////////////////////////////////////////////////////////////////
typedef struct {
	//The page soze used on the host machine
	DWORD dwPageSize;

	//Handles of the source and destination files
	HANDLE hFileSrc, hFileDst;

	//Size of source file
	ULARGE_INTEGER ulFileSize;

	//Offset in source file where next read begins
	ULARGE_INTEGER ulNextReadOffset;
	
	//The number of pending read and write I/O requests
	int nReadsInProgress;
	int nWritesInProgress;
} COPYSTATE, *PCOPYSTATE;

//Each IO requires an OVERLAPPED structure and a buffer.
typedef struct {
	OVERLAPPED Overlapped;
	PBYTE pbData;
} IOREQ, *PIOREQ;

#define MAX_PENDING_IO_REQS 4
#define BUFFSIZE			(64 * 1024)

//The keys indicating the type of completed IO
#define COMPKEY_READ 1
#define COMPKEY_WRITE 2

//////////////////////////////////////////////////////////////////////

BOOL FileCopy (LPCTSTR pszFileSrc, LPCTSTR pszFileDst){

	//We need a local copy state variable.
	COPYSTATE cs;

	//Maintain info about each IO request.
	IOREQ IOReq[MAX_PENDING_IO_REQS] = { 0 };

	SYSTEM_INFO si;
	int nIOReq;
	BOOL fOk, fDone = FALSE;

	// I/O Completion Port where read and writes complete to 
	HANDLE hIOCompPort = NULL;

	DWORD dwNumBytesXfer, dwCompKey;
	LPOVERLAPPED pOverlapped;

	// Initialize the global COPYSTATE variable.
	GetSystemInfo(&si);
	cs.dwPageSize = si.dwPageSize;
	cs.ulNextReadOffset.QuadPart = 0;
	cs.nReadsInProgress = 0;
	cs.nWritesInProgress = 0;

	//Open the existing source file for input.
	fOk = PrepareDstFile(pszFileSrc, pszFileDst,
		&cs.hFileSrc, &cs.hFileDst,
		&cs.ulFileSize, cs.dwPageSize);
	if (!fOk)
		return(fOk);

	//Create a new completion port kernel object.
	hIOCompPort = CreateNewCompletionPort(0);
	chASSERT(hIOCompPort != NULL);

	//Associate completed IOs to/from the source file with
	//IO Completion Port.  All completed IOs have a 
	// completion key of COMPKEY_READ.
	chVERIFY(AssociateDeviceWithCompletionPort(hIOCompPort, 
		cs.hFileDst, COMPKEY_READ));

	//Associate completed IOs to/from the destination file
	//with IO Completion Port.  All completed IOs have a 
	// completion key of COMPKEY_WRITE.
	chVERIFY(AssociateDeviceWithCompletionPort(hIOCompPort,
		cs.hFileDst, COMPKEY_WRITE));

	//Start the copy engine by posting a number of read 
	//IO requests against the source file.
	for (nIOReq = 0; nIOReq < MAX_PENDING_IO_REQS;
	nIOReq++) {
		IOReq[nIOReq].Overlapped.Internal = 0;
		IOReq[nIOReq].Overlapped.InternalHigh = 0;
		IOReq[nIOReq].Overlapped.Offset = 0;
		IOReq[nIOReq].Overlapped.OffsetHigh = 0;
		IOReq[nIOReq].Overlapped.hEvent = NULL;
		IOReq[nIOReq].pbData = VirtualAlloc(NULL,
			BUFFSIZE, MEM_RESERVE | MEM_COMMIT,
			PAGE_READWRITE);

		cs.nWritesInProgress++;
		PostQueuedCompletionStatus(hIOCompPort, 0,
			COMPKEY_WRITE, &IOReq[nIOReq].Overlapped);
	}

	//Loop untill an error has occurred or until the 
	//destination file has been written.
	while ((cs.nReadsInProgress > 0) ||
		(cs.nWritesInProgress > 0)) {
		PIOREQ pIOReq;
		fOk = GetQueuedCompletionStatus(hIOCompPort,
			&dwNumBytesXfer, &dwCompKey, &pOverlapped,
			INFINITE);
		chASSERT(fOk || (GetLastError() == NO_ERROR));
		pIOReq = (PIOREQ) pOverlapped;

		switch (dwCompKey){
		case COMPKEY_READ:
			cs.nReadsInProgress--;
			//Round up the number of bytes to write
			//to a sector boundary.
			dwNumBytesXfer =
				(dwNumBytesXfer + cs.dwPageSize - 1) &
				~(cs.dwPageSize - 1);
			fOk = WriteFile(cs.hFileDst, pIOReq->pbData,
				dwNumBytesXfer, &dwNumBytesXfer,
				pOverlapped);
			// The write either completed or is pending.
			chASSERT(fOk || (!fOk &&
				(GetLastError() == ERROR_IO_PENDING)));
			cs.nWritesInProgress++;
			break;

		case COMPKEY_WRITE:
			cs.nWritesInProgress--;
			if (cs.ulNextReadOffset.QuadPart >=
				cs.ulFileSize.QuadPart)
				break;

			//We haven't read past the end of the file yet.
			//Read the next chunk of data.
			pOverlapped->Offset =
				cs.ulNextReadOffset.LowPart;
			pOverlapped->OffsetHigh =
				cs.ulNextReadOffset.HighPart;
			fOk = ReadFile(cs.hFileSrc, pIOReq->pbData,
				BUFFSIZE, &dwNumBytesXfer, pOverlapped);
			//The read either completed or is pending.
			chASSERT(fOk || (!fOk &&
				(GetLastError() == ERROR_IO_PENDING)));
			cs.nReadsInProgress++;
			//Offset in source file where next read begins
			cs.ulNextReadOffset.QuadPart += BUFFSIZE;
			break;
		}
	}

	//Destroy the I/O completion port.
	CloseHandle(hIOCompPort);

	//Free the memory buffers used for the copy.
	for (nIOReq = 0; nIOReq < MAX_PENDING_IO_REQS;
	nIOReq++){
		VirtualFree(IOReq[nIOReq].pbData, 0, MEM_RELEASE);
	}

	//Close the source and destination files; force the 
	//destination file to be the same size as the source.
	CopyCleanup(pszFileDst, cs.hFileSrc, cs.hFileDst,
		&cs.ulFileSize);

	return(TRUE);
	}

//////////////////////////////////////////////////////////////////////

BOOL Dlg_OnInitDialog (HWND hwnd, HWND hwndFocus,
					  LPARAM lParam){

	//Associate an icon with the dialog box.
	chSETDLGICONS(hwnd, IDI_IOCMPPRT, IDI_IOCMPPRT);

	//Disable the "Copy" button because no file 
	//has been selected yet.
	EnableWindow(GetDlgItem(hwnd, IDOK), FALSE);

	return(TRUE);
}

//////////////////////////////////////////////////////////////////////

void Dlg_OnCommand(HWND hwnd, int id, 
				   HWND hwndCtl, UINT codeNoteify){

	TCHAR szPathname[_MAX_DIR];
	BOOL fOk;
	OPENFILENAME ofn;

	switch (id) {
	case IDOK:
		//Copy the source file to the destination file.
		Static_GetText(GetDlgItem(hwnd, IDC_SRCFILE),
			szPathname, sizeof(szPathname));
		SetCursor(LoadCursor(NULL, IDC_WAIT));
		FileCopy(szPathname, _TEXT("IOCmpPrt.CPY"));
		break;

	case IDC_BROWSE:
		chINITSTRUCT(ofn, TRUE);
		ofn.hwndOwner = hwnd;
		ofn.lpstrFilter = _TEXT("*.*\0");
		_tcscpy(szPathname, _TEXT("*.*"));
		ofn.lpstrFile = szPathname;
		ofn.nMaxFile = sizeof(szPathname);
		ofn.Flags = OFN_FILEMUSTEXIST;
		fOk = GetOpenFileName(&ofn);

		if (fOk) {
			HANDLE hFile;
			Static_SetText(GetDlgItem(hwnd, IDC_SRCFILE),
				szPathname);
			hFile = CreateFile(szPathname, GENERIC_READ,
				0, NULL, OPEN_EXISTING, 0, NULL);

			SetDlgItemInt(hwnd, IDC_SRCFILESIZE,
				GetFileSize(hFile, NULL), FALSE);
			CloseHandle(hFile);
		}

		//Enable the "Copy" button if the user selected 
		//a valid pathname.
		GetWindowText(GetDlgItem(hwnd, IDC_SRCFILE),
			szPathname, sizeof(szPathname));
		EnableWindow(GetDlgItem(hwnd, IDOK),
			szPathname[0] != _TEXT('('));
		if (fOk){
			// If the user pressed the OK button in the file 
			//dialog box, change focus to the "Copy" button
			FORWARD_WM_NEXTDLGCTL(hwnd, 
				GetDlgItem(hwnd, IDOK), TRUE, SendMessage);
		}
		break;

	case IDCANCEL:
			EndDialog(hwnd, id);
			break;
	}
}

//////////////////////////////////////////////////////////////////////

BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg,
						WPARAM wParam, LPARAM lParam){

	switch (uMsg){
		chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);
		chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand);
	}
	
	return(FALSE);
}

//////////////////////////////////////////////////////////////////////

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
 {

 	chWARNIFUNICODEUNDERWIN95();
 	DialogBox(hInstance, MAKEINTRESOURCE(IDD_IOCMPPRT), NULL, Dlg_Proc);

	return(0);
  }

//////////////////////////End Of File/////////////////////////////////









?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩不卡免费视频| a在线欧美一区| 日韩黄色一级片| 婷婷开心久久网| 亚洲国产日日夜夜| 婷婷综合另类小说色区| 日日夜夜一区二区| 美国精品在线观看| 蜜桃视频一区二区三区在线观看| 婷婷久久综合九色国产成人| 日韩精品电影一区亚洲| 日韩国产高清在线| 蜜臀精品久久久久久蜜臀| 蜜桃在线一区二区三区| 国产乱码字幕精品高清av| 国产.欧美.日韩| av一二三不卡影片| 91黄色激情网站| 欧美精品三级日韩久久| 欧美一区二区三区的| 久久影院视频免费| 国产精品女上位| 亚洲精品亚洲人成人网| 午夜天堂影视香蕉久久| 久久精品国产**网站演员| 国产另类ts人妖一区二区| 成人午夜私人影院| 色88888久久久久久影院野外| 欧美日韩一区成人| 精品国产亚洲在线| 国产精品美女久久久久久2018| 亚洲视频一区二区在线观看| 亚洲精品中文在线观看| 一区av在线播放| 亚洲va在线va天堂| 日本欧美一区二区在线观看| 蜜臀av一区二区在线免费观看| 美国毛片一区二区三区| 午夜电影久久久| 91麻豆免费观看| 日本道精品一区二区三区| 91黄色免费看| 欧美一区二区大片| 久久久精品蜜桃| 亚洲欧美精品午睡沙发| 亚洲综合激情另类小说区| 日韩精品一卡二卡三卡四卡无卡| 麻豆精品国产传媒mv男同| 国产精品白丝jk黑袜喷水| av电影在线不卡| 欧美性受xxxx黑人xyx性爽| 欧美精品在线一区二区| 久久综合狠狠综合久久综合88| 日本一区二区三区视频视频| 中文字幕中文乱码欧美一区二区 | 欧美日韩免费在线视频| 日本高清不卡aⅴ免费网站| 欧美日韩精品欧美日韩精品| 欧美成人女星排行榜| 国产欧美日韩另类视频免费观看| 亚洲视频免费在线观看| 日韩av在线免费观看不卡| 国产精品99久久久| 在线日韩av片| 精品久久久久久亚洲综合网| **欧美大码日韩| 天天av天天翘天天综合网色鬼国产| 九九热在线视频观看这里只有精品| 懂色av一区二区在线播放| 欧美特级限制片免费在线观看| 精品国偷自产国产一区| 亚洲猫色日本管| 精品一区二区三区在线播放视频| 99精品视频中文字幕| 欧美高清性hdvideosex| 欧美国产精品中文字幕| 日韩黄色免费电影| 99久久免费国产| 91精品国产黑色紧身裤美女| 日韩精品最新网址| 亚洲国产欧美在线| 成人美女视频在线看| 777a∨成人精品桃花网| 综合久久国产九一剧情麻豆| 另类小说色综合网站| 在线欧美小视频| 欧美国产日韩精品免费观看| 日韩主播视频在线| 色哟哟国产精品| 国产亚洲综合在线| 日本视频中文字幕一区二区三区| 91视频观看免费| 久久久99精品久久| 轻轻草成人在线| 欧美性生活大片视频| 久久久久久久网| 精品一区二区三区日韩| 欧美日韩国产综合一区二区| 亚洲欧美日韩国产中文在线| 日韩一区二区免费高清| 亚洲伊人色欲综合网| 99这里只有久久精品视频| 宅男噜噜噜66一区二区66| 欧美一区二区黄色| 日韩av高清在线观看| 色婷婷综合久久久久中文一区二区| 久久精品日韩一区二区三区| 日本成人在线网站| 欧美日韩国产乱码电影| 国产精品盗摄一区二区三区| 国产精品一二三区| 精品国产免费一区二区三区香蕉| 亚洲国产精华液网站w| 国产老妇另类xxxxx| 精品福利视频一区二区三区| 欧美aaa在线| 这里只有精品电影| 日本欧美一区二区在线观看| 欧美剧情电影在线观看完整版免费励志电影| 国产精品日产欧美久久久久| 国内外成人在线| 精品少妇一区二区| 精品系列免费在线观看| 欧美大黄免费观看| 日韩国产欧美一区二区三区| 欧美高清一级片在线| 视频一区在线播放| 日韩视频123| 精品一区中文字幕| 久久久www免费人成精品| 国产精品1区2区| 亚洲国产成人午夜在线一区| 岛国一区二区在线观看| 国产欧美日韩不卡免费| 色综合天天性综合| 亚洲va在线va天堂| 在线播放视频一区| 久久国产精品色| 国产婷婷色一区二区三区四区| 国产盗摄一区二区三区| 中文字幕一区二区三区视频| 色域天天综合网| 日韩国产一二三区| 精品国产乱码久久久久久老虎| 国产一区二区电影| 美女尤物国产一区| 欧美精品一区二区三区很污很色的 | 91久久久免费一区二区| 亚洲国产sm捆绑调教视频| 欧美日韩一区高清| 蜜桃精品视频在线| 国产精品久久一卡二卡| 欧美综合久久久| 亚洲综合在线五月| 欧美精品三级在线观看| 国产69精品久久久久毛片 | 国产精品综合二区| 1000精品久久久久久久久| 欧美亚洲一区二区三区四区| 蜜臀av性久久久久蜜臀aⅴ | 亚洲一区二区视频| 337p日本欧洲亚洲大胆精品 | 懂色av一区二区夜夜嗨| 亚洲专区一二三| 精品毛片乱码1区2区3区| 成人午夜大片免费观看| 亚洲自拍与偷拍| 久久嫩草精品久久久久| 91丨九色丨蝌蚪富婆spa| 免费美女久久99| 最近中文字幕一区二区三区| 717成人午夜免费福利电影| 成人午夜私人影院| 五月开心婷婷久久| 热久久免费视频| 国产精品第四页| 日韩一卡二卡三卡国产欧美| av在线这里只有精品| 麻豆精品在线看| 亚洲综合一区在线| 久久婷婷国产综合国色天香 | 欧美日韩一区二区三区不卡| 国产真实精品久久二三区| 玉米视频成人免费看| 久久尤物电影视频在线观看| 欧美亚洲综合在线| 成人激情综合网站| 免费成人深夜小野草| 亚洲在线视频一区| 久久蜜桃av一区精品变态类天堂| 91麻豆精品秘密| 成人av电影在线| 国产乱人伦偷精品视频不卡| 视频一区视频二区中文字幕| 亚洲欧美日韩在线播放| 国产免费成人在线视频| 日韩欧美一级二级| 欧美精品日韩一本| 91在线免费看| 成人综合在线观看|