#include <windows.h>#include <ktmw32.h>#include <stdio.h>#include <stdlib.h>#include <tchar.h>#include <strsafe.h>LPTSTR szKeywords[10]={_T("cat"), _T("dog"), _T("rabbit"), _T("horse"), _T("cow"), _T("chicken"), _T("bird"), _T("mouse"), _T("donkey"), _T("camel")};#define NUM_WORDS 10LPTSTR szFileName=_T("testfile");void WriteRandomWord(HANDLE hFile){ BOOL bRet; DWORD dwWord, dwWrote; dwWord = rand()%NUM_WORDS; SetFilePointer(hFile, 0, NULL, FILE_BEGIN); bRet = WriteFile(hFile, szKeywords[dwWord], (_tcslen(szKeywords[dwWord])+1) * sizeof(TCHAR), &dwWrote, NULL); SetEndOfFile(hFile); if (bRet) _tprintf(_T("Wrote \"%s\" to file\n"), szKeywords[dwWord]);}void DisplayFileContents(HANDLE hFile, LPTSTR szDesc){ TCHAR szReadIn[20]; DWORD dwLen; DWORD dwRead; BOOL bRet; SetFilePointer(hFile, 0, NULL, FILE_BEGIN); dwLen = GetFileSize(hFile, NULL); bRet = ReadFile(hFile, szReadIn, dwLen, &dwRead, NULL); if (bRet) _tprintf(_T("Read \"%s\" from file (%s)\n"), szReadIn, szDesc);}int __cdecl _tmain(int argc, TCHAR ** argv){ HANDLE hWriterFile; HANDLE hReaderFile; HANDLE hNonTransReaderFile; HANDLE hWriterTrans; HANDLE hReaderTrans; DWORD dwLoop; srand(GetTickCount()); hReaderTrans = CreateTransaction(NULL, NULL, 0, 0, 0, 0, NULL); if (hReaderTrans == NULL) { _tprintf(_T("Could not create transaction\n")); return EXIT_FAILURE; } hWriterFile = CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if (hWriterFile == INVALID_HANDLE_VALUE) { _tprintf(_T("Could not create test file\n")); return EXIT_FAILURE; } WriteRandomWord(hWriterFile); CloseHandle(hWriterFile); hNonTransReaderFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); SetCurrentTransaction(hReaderTrans); hReaderFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); for (dwLoop=0;dwLoop<10;dwLoop++) { hWriterTrans = CreateTransaction(NULL, NULL, 0, 0, 0, 0, NULL); if (hWriterTrans == NULL) { _tprintf(_T("Could not create transaction\n")); return EXIT_FAILURE; } SetCurrentTransaction(hWriterTrans); hWriterFile = CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); WriteRandomWord(hWriterFile); CloseHandle(hWriterFile); CommitTransaction(hWriterTrans); CloseHandle(hWriterTrans); SetCurrentTransaction(NULL); DisplayFileContents(hReaderFile, _T("transacted")); DisplayFileContents(hNonTransReaderFile, _T("non-transacted")); } CloseHandle(hReaderFile); CloseHandle(hNonTransReaderFile); RollbackTransaction(hReaderTrans); CloseHandle(hReaderTrans); SetCurrentTransaction(NULL); DeleteFile(szFileName); return EXIT_SUCCESS;}