|
// InProcessThreadShareTest.cpp : Defines the entry point for the console application. |
|
// |
|
|
|
#include "stdafx.h" |
|
#include <windows.h> |
|
|
|
void EmitError(DWORD dwErr) |
|
{ |
|
if(dwErr != 0) |
|
{ |
|
LPVOID tszBuf = 0; |
|
DWORD dwFmt = FormatMessage( |
|
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, |
|
0, dwErr, 0, (LPTSTR)(&tszBuf), 0, 0); |
|
_tprintf(_T("Message:\r\n--\r\n%s\t\n"), (LPTSTR)tszBuf); |
|
if(tszBuf){::LocalFree(&tszBuf);} |
|
} |
|
} |
|
|
|
DWORD WINAPI OtherThreadProc(LPVOID arg) |
|
{ |
|
_tprintf(_T("** Begin Other Thread\r\n")); |
|
HANDLE hFile = ::CreateFile(_T("C:\\data\\tmp\\sharetest.txt"), |
|
(GENERIC_READ | GENERIC_WRITE), |
|
(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE), |
|
0, OPEN_EXISTING, |
|
FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, |
|
0); |
|
DWORD dwErr = GetLastError(); |
|
_tprintf(_T("File Handle: %8.8x\r\n"), (ULONG)hFile); |
|
_tprintf(_T("Last Error: %8.8x\r\n"), dwErr); |
|
if(dwErr != 0) |
|
{ |
|
EmitError(dwErr); |
|
} |
|
else |
|
{ |
|
DWORD dwIn = 0; |
|
DWORD dwData = 0; |
|
_tprintf(_T("Old Data: %8.8x\r\n"), dwData); |
|
::ReadFile(hFile, &dwData, sizeof(DWORD), &dwIn, 0); |
|
_tprintf(_T("New Data: %8.8x\r\n%d bytes read.\r\n"), dwData, dwIn); |
|
DWORD dwPos = sizeof(DWORD); |
|
DWORD dwOut = 0; |
|
dwData = 0xF0F0F0F0; |
|
::SetFilePointer(hFile, dwPos, 0, FILE_BEGIN); |
|
::WriteFile(hFile, &dwData, sizeof(DWORD), &dwOut, 0); |
|
::FlushFileBuffers(hFile); |
|
_tprintf(_T("Wrote New Data: %8.8x @ 0x%8.8x\r\n"), dwData, dwPos); |
|
_tprintf(_T("New Size: %d bytes\r\n"), GetFileSize(hFile, NULL)); |
|
} |
|
Sleep(4000); |
|
::CloseHandle(hFile); |
|
_tprintf(_T("** End Other Thread\r\n")); |
|
return 0; |
|
} |
|
|
|
int _tmain(int argc, _TCHAR* argv[]) |
|
{ |
|
_tprintf(_T("** Begin Main Thread\r\n")); |
|
_tprintf(_T("Creating File\r\n")); |
|
HANDLE hFile = ::CreateFile(_T("C:\\data\\tmp\\sharetest.txt"), |
|
(GENERIC_READ | GENERIC_WRITE), |
|
(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE), |
|
0, CREATE_ALWAYS, |
|
FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, |
|
0); |
|
|
|
DWORD dwErr = GetLastError(); |
|
if(dwErr != 0) |
|
{ |
|
EmitError(dwErr); |
|
_tprintf(_T("** Exit Main Thread\r\n")); |
|
Sleep(20000); |
|
return 1; |
|
} |
|
DWORD dwData = 0x12345678; |
|
DWORD dwOut = 0; |
|
::WriteFile(hFile, &dwData, sizeof(DWORD), &dwOut, 0); |
|
_tprintf(_T("Wrote New Data: %8.8x (%d bytes)\r\n"), dwData, dwOut); |
|
::FlushFileBuffers(hFile); |
|
_tprintf(_T("New Size: %d bytes\r\n"), GetFileSize(hFile, NULL)); |
|
|
|
DWORD threadID = 0; |
|
HANDLE hThread = ::CreateThread(0, 0, OtherThreadProc, 0, 0, &threadID); |
|
_tprintf(_T("** Sleep() Main Thread\r\n")); |
|
|
|
Sleep(10000); |
|
|
|
::CloseHandle(hThread); |
|
|
|
_tprintf(_T("** Resume Main Thread\r\n")); |
|
_tprintf(_T("Reported File Size: %d bytes\r\n"), GetFileSize(hFile, NULL)); |
|
DWORD dwPos = sizeof(DWORD); |
|
DWORD dwIn = 0; |
|
_tprintf(_T("Old Data: %8.8x\r\nReading from 0x%8.8x\r\n"), dwData, dwPos); |
|
dwData = 0; |
|
::SetFilePointer(hFile, dwPos, 0, FILE_BEGIN); |
|
dwErr = GetLastError(); |
|
if(dwErr != 0) |
|
{ |
|
_tprintf(_T("Error during SetFilePointer()\r\n")); |
|
EmitError(dwErr); |
|
} |
|
|
|
::ReadFile(hFile, &dwData, sizeof(DWORD), &dwIn, 0); |
|
|
|
dwErr = GetLastError(); |
|
if(dwErr != 0) |
|
{ |
|
_tprintf(_T("Error during ReadFile()\r\n")); |
|
EmitError(dwErr); |
|
} |
|
else |
|
{ |
|
_tprintf(_T("New Data: %8.8x\r\n%d bytes read.\r\n"), dwData, dwIn); |
|
} |
|
|
|
::CloseHandle(hFile); |
|
|
|
_tprintf(_T("** End Main Thread\r\n")); |
|
Sleep(10000); |
|
return 0; |
|
} |