Practical of Windows File
Practical of Windows File
OF
Programming in Windows
Environment
(Paper code: OSD-330P)
Roll no:10015603121
INDEX
Roll no:10015603121
EXPERIMENT 1
Aim:Printing the Current Directory
Code:
#ifdef _WIN32
#include <direct.h>
#else
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Roll no:10015603121
char* get_current_dir() {
char buff[FILENAME_MAX];
GetCurrentDir(buff, FILENAME_MAX);
return current_working_dir;
int main() {
printf("%s\n", cwd);
free(cwd);
return 0;
Output:
Roll no:10015603121
EXPERIMENT 2
Aim:File Listing and Directory Traversal
Code:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
return FILE_ATTRIBUTE_DIRECTORY;
} else {
Roll no:10015603121
return FILE_ATTRIBUTE_NORMAL;
if (FileType(pData) == FILE_ATTRIBUTE_DIRECTORY) {
printf("%s\\%s\n",DirPath,pData->cFileName);
} else {
WIN32_FIND_DATA findData;
TCHAR searchPath[MAX_PATH];
LPCTSTR Dirpath=path;
_tcscpy(searchPath, path);
Roll no:10015603121
_tcscat(searchPath, _T("\\*"));
if (hFind == INVALID_HANDLE_VALUE) {
return;
do {
ProcessFile(&findData, path,Dirpath);
if (FileType(&findData) == FILE_ATTRIBUTE_DIRECTORY) {
TCHAR subDirPath[MAX_PATH];
_tcscpy(subDirPath, path);
_tcscat(subDirPath, _T("\\"));
_tcscat(subDirPath, findData.cFileName);
TraverseDirectory(subDirPath);
Roll no:10015603121
}
FindClose(hFind);
char str[FILENAME_MAX];
TraverseDirectory(directoryPath);
return 0;
Roll no:10015603121
Output:
Roll no:10015603121
EXPERIMENT 3
Aim:File Processing with Error and Exception Recovery
Code:
#include <WinSock2.h>
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
Roll no:10015603121
#if defined(UTILITY_4_0_EXPORTS)
#elif defined(__cplusplus)
#else
#endif
OVERLAPPED ov = { 0, 0, 0, 0, NULL };
LARGE_INTEGER fSize;
Roll no:10015603121
if (!WindowsVersionOK(3, 1))
1, FALSE);
if (argc <= 1)
__try {
Roll no:10015603121
hOut = CreateFile(outFileName, GENERIC_READ |
GENERIC_WRITE,
if (hOut == INVALID_HANDLE_VALUE)
ReportException(outFileName, 1);;
__finally {
Roll no:10015603121
if (pBuffer != NULL) free(pBuffer); pBuffer = NULL;
if (hIn != INVALID_HANDLE_VALUE) {
CloseHandle(hIn);
hIn = INVALID_HANDLE_VALUE;
if (hOut != INVALID_HANDLE_VALUE) {
CloseHandle(hOut);
hOut = INVALID_HANDLE_VALUE;
wcscpy_s(outFileName, _T(""));
__except (EXCEPTION_EXECUTE_HANDLER) {
DeleteFile(outFileName);
return 0;
Roll no:10015603121
Output:
Roll no:10015603121
EXPERIMENT 4
Aim:Sorting a File with Memory Mapping
Code:
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <Windows.h>
Roll no:10015603121
bool compare(int a, int b) {
return a < b;
int main() {
if (hFile == INVALID_HANDLE_VALUE) {
return 1;
if (fileSize == INVALID_FILE_SIZE) {
CloseHandle(hFile);
return 1;
Roll no:10015603121
HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0,
NULL);
if (hMapping == NULL) {
CloseHandle(hFile);
return 1;
if (lpData == NULL) {
CloseHandle(hMapping);
CloseHandle(hFile);
return 1;
Roll no:10015603121
UnmapViewOfFile(lpData);
CloseHandle(hMapping);
CloseHandle(hFile);
return 0;
Output:
Roll no:10015603121
EXPERIMENT 5
Aim:Create an Index File
Code:
#include <Windows.h>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
vector<string> filenames;
Roll no:10015603121
WIN32_FIND_DATA findData;
if (hFind != INVALID_HANDLE_VALUE) {
do {
filenames.push_back(findData.cFileName);
FindClose(hFind);
sort(filenames.begin(), filenames.end());
return filenames;
int main() {
vector<HANDLE> fileMappings;
Roll no:10015603121
vector<LPVOID> mappedFilePointers;
if (hFile != INVALID_HANDLE_VALUE) {
if (hMapping != NULL) {
if (pData != NULL) {
fileMappings.push_back(hMapping);
mappedFilePointers.push_back(pData);
else {
CloseHandle(hMapping);
else {
CloseHandle(hFile);
Roll no:10015603121
}
cout << "Filename: " << filenames[i] << ", Memory-mapped pointer: " <<
mappedFilePointers[i] << endl;
else {
UnmapViewOfFile(mappedFilePointers[i]);
CloseHandle(fileMappings[i]);
return 0;
Roll no:10015603121
}
Output:
Roll no:10015603121
EXPERIMENT 6
Aim:Create a DLL with Explicit linking
Code:
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif
int z;
z = x + y;
Roll no:10015603121
return z;
int z;
z = x - y;
return z;
int z;
z = x * y;
return z;
int z;
z = x / y;
return z;
Roll no:10015603121
#ifdef __cplusplus
#endif
MyMathProgram.cpp
#include <Windows.h>
#include <stdio.h>
int main()
HMODULE hModule;
hModule =
LoadLibrary(TEXT("C:\\Users\\HP\\source\\repos\\MyMath\\x64\\Debug\\MyMath
.dll"));
if (hModule == NULL)
Roll no:10015603121
{
return 1;
if (NULL == MulFunc)
return 1;
Roll no:10015603121
FreeLibrary(hModule);
return 0;
Output:
Roll no:10015603121
EXPERIMENT 7
Aim:Parallel Searching using multiple processes
Code:
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
#if defined(UTILITY_4_0_EXPORTS)
#elif defined(__cplusplus)
#else
Roll no:10015603121
#define LIBSPEC __declspec (dllimport)
#endif
HANDLE hTempFile;
PROCESS_INFORMATION processInfo;
int iProc;
HANDLE* hProc;
PROCFILE* procFile;
#ifdef UNICODE
dwCreationFlags = CREATE_UNICODE_ENVIRONMENT;
#endif
if (argc < 3)
Roll no:10015603121
GetStartupInfo(&startUpSearch);
GetStartupInfo(&startUp);
if (hTempFile == INVALID_HANDLE_VALUE)
Roll no:10015603121
startUpSearch.dwFlags = STARTF_USESTDHANDLES;
startUpSearch.hStdOutput = hTempFile;
startUpSearch.hStdError = hTempFile;
startUpSearch.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
CloseHandle(hTempFile);
CloseHandle(processInfo.hThread);
hProc[iProc] = processInfo.hProcess;
Roll no:10015603121
if (GetExitCodeProcess(hProc[iProc], &exitCode) && exitCode == 0) {
else {
WaitForSingleObject(processInfo.hProcess, INFINITE);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
CloseHandle(hProc[iProc]);
if (!DeleteFile(procFile[iProc].tempFile))
free(procFile);
free(hProc);
return 0;
Roll no:10015603121
}
Output:
Roll no:10015603121
EXPERIMENT 8
Aim:Multithreaded Pattern Searching
Code:
#include <stdio.h>
#include <windows.h>
#include <process.h>
#include <tchar.h>
Roll no:10015603121
#define ASTRSK 1
#define QM 2
#define BEGCLASS 3
#define ENDCLASS 4
#define ANCHOR 5
typedef struct {
int argc;
TCHAR targv[4][MAX_COMMAND_LINE];
} GREP_THREAD_ARG;
BOOL ok;
Roll no:10015603121
int _tmain(int argc, LPTSTR argv[]) {
PGR_ARGS gArg;
HANDLE* tHandle;
STARTUPINFO startUp;
PROCESS_INFORMATION processInfo;
GetStartupInfo(&startUp);
if (argc < 3) {
return 1;
Roll no:10015603121
for (iThrd = 0; iThrd < argc - 2; iThrd++) {
gArg[iThrd].argc = 4;
threadCount = argc - 2;
GetExitCodeThread(tHandle[iThrd], &exitCode);
CloseHandle(tHandle[iThrd]);
if (exitCode == 0) {
Roll no:10015603121
if (argc > 3) {
_tprintf(_T("%s\n"), gArg[iThrd].targv[2]);
fflush(stdout);
WaitForSingleObject(processInfo.hProcess, INFINITE);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
Roll no:10015603121
_tcscpy_s(gArg[iThrd].targv[2], MAX_COMMAND_LINE, gArg[threadCount -
1].targv[2]);
threadCount--;
HeapFree(GetProcessHeap(), 0, tHandle);
HeapFree(GetProcessHeap(), 0, gArg);
return 0;
TCHAR pattern[256];
TCHAR string[2048];
// Declare ok variable
argc = pArguments->argc;
Roll no:10015603121
printf("Failure to open output file.\n");
return 1;
if (pArguments->targv[i][0] == _T('-')) {
switch (pArguments->targv[i][1]) {
case _T('y'):
ignoreCase = TRUE;
break;
else {
if (!patternSeen++)
prepSearchString(pArguments->targv[i], pattern);
if (ignoreCase) _tcslwr_s(string);
if (patternMatch(pattern, string)) {
Roll no:10015603121
result = 0;
if (showName) {
fputws(pArguments->targv[i], fpout);
fputws(string, fpout);
else
fputws(string, fpout);
fclose(fp);
fclose(fpout);
return result;
Roll no:10015603121
FILE* fp = NULL;
return fp;
register int c;
register int i = 0;
if (*p == _T('^')) {
buf[i++] = ANCHOR;
++p;
for (;;) {
switch (c = *p++) {
Roll no:10015603121
case _T(']'): c = ENDCLASS; break;
case _T('\\'):
switch (c = *p++) {
break;
Exit:
buf[i] = EOS;
Roll no:10015603121
static BOOL patternMatch(TCHAR* pattern, TCHAR* string) {
TCHAR* pat;
BOOL anchored;
Top:
pat = pattern;
Again:
pc = *pat;
sc = *string;
++pat;
goto Again;
Roll no:10015603121
}
else {
if (pc == sc || pc == QM) {
++pat;
++string;
goto Again;
else {
++string;
goto Again;
Roll no:10015603121
if (!clmatch && *pat == sc) clmatch = TRUE;
if (clmatch) {
++pat;
++string;
goto Again;
++string;
goto Top;
Success:
return (TRUE);
Roll no:10015603121
Output:
Roll no:10015603121
EXPERIMENT 9
Aim:Write a socket based client
Code:
#include <winsock2.h>
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <ws2tcpip.h>
Roll no:10015603121
#define MAX_RQRS_LEN 0x1000
typedef struct {
LONG32 rqLen;
BYTE record[MAX_RQRS_LEN];
} REQUEST;
typedef struct {
LONG32 rsLen;
BYTE record[MAX_RQRS_LEN];
} RESPONSE;
SOCKET clientSock;
Roll no:10015603121
int main(int argc, char* argv[]) {
WSADATA WSStartData;
REQUEST request;
RESPONSE response;
if (clientSock == INVALID_SOCKET) {
WSACleanup();
return 1;
memset(&clientSAddr, 0, sizeof(clientSAddr));
clientSAddr.sin_family = AF_INET;
clientSAddr.sin_port = htons(SERVER_PORT);
if (argc >= 2) {
Roll no:10015603121
}
else {
closesocket(clientSock);
WSACleanup();
return 1;
while (!quit) {
request.record[strlen(request.record) - 1] = '\0';
if (strcmp(request.record, "$Quit") == 0) {
quit = TRUE;
Roll no:10015603121
continue;
if (!SendRequestMessage(&request, clientSock)) {
break;
break;
shutdown(clientSock, SD_BOTH);
closesocket(clientSock);
WSACleanup();
printf("\n****Leaving client\n");
return 0;
Roll no:10015603121
BOOL SendRequestMessage(REQUEST* pRequest, SOCKET sd) {
Output:
Roll no:10015603121
EXPERIMENT 10
Aim:Socket-Based Server with In-Process Servers
Code:
#include <winsock2.h>
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <ws2tcpip.h>
Roll no:10015603121
struct sockaddr_in srvSAddr;
WSADATA WSStartData;
#define MAX_CLIENTS 10
typedef struct {
SOCKET sock;
BOOL threadActive;
} THREAD_INFO;
typedef struct {
LONG32 rqLen;
BYTE record[MAX_RQRS_LEN];
} REQUEST;
typedef struct {
LONG32 rsLen;
BYTE record[MAX_RQRS_LEN];
} RESPONSE;
Roll no:10015603121
SOCKET clientSock;
int main() {
DWORD tStatus;
THREAD_INFO threads[MAX_CLIENTS];
printf("WSAStartup failed\n");
return 1;
if (SrvSock == INVALID_SOCKET) {
Roll no:10015603121
WSACleanup();
return 1;
srvSAddr.sin_family = AF_INET;
srvSAddr.sin_addr.s_addr = htonl(INADDR_ANY);
srvSAddr.sin_port = htons(SERVER_PORT);
printf("Bind failed\n");
closesocket(SrvSock);
WSACleanup();
return 1;
printf("Listen failed\n");
closesocket(SrvSock);
WSACleanup();
return 1;
Roll no:10015603121
for (int i = 0; i < MAX_CLIENTS; ++i) {
threads[i].sock = INVALID_SOCKET;
threads[i].threadActive = FALSE;
while (1) {
if (!threads[i].threadActive) {
freeThread = i;
break;
if (freeThread != -1) {
if (threads[freeThread].sock == INVALID_SOCKET) {
printf("Accept failed\n");
continue;
Roll no:10015603121
threads[freeThread].threadActive = TRUE;
DWORD dwThreadId;
if (hThread == NULL) {
closesocket(threads[freeThread].sock);
threads[freeThread].sock = INVALID_SOCKET;
threads[freeThread].threadActive = FALSE;
else {
CloseHandle(hThread);
else {
Sleep(1000);
Roll no:10015603121
closesocket(SrvSock);
WSACleanup();
return 0;
REQUEST request;
RESPONSE response;
while (1) {
if (!ReceiveRequestMessage(&request, clientSock)) {
break;
if (strcmp(request.record, "$Quit") == 0) {
break;
Roll no:10015603121
if (!SendResponseMessage(&response, clientSock)) {
break;
closesocket(clientSock);
pInfo->threadActive = FALSE;
return 0;
Roll no:10015603121
Output:
Roll no:10015603121
EXPERIMENT 11
Aim:Write code for A Service Wrapper using existing services
Code:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <time.h>
Roll no:10015603121
BOOL shutDown = FALSE, pauseFlag = FALSE;
SERVICE_STATUS hServStatus;
SERVICE_STATUS_HANDLE hSStat;
// Initialize service
SERVICE_TABLE_ENTRY DispatchTable[] = {
Roll no:10015603121
{ serviceName, ServiceMain },
{ NULL, NULL }
};
StartServiceCtrlDispatcher(DispatchTable);
return 0;
if (hSStat == 0) return;
hServStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
hServStatus.dwCurrentState = SERVICE_START_PENDING;
hServStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
hServStatus.dwWin32ExitCode = NO_ERROR;
hServStatus.dwServiceSpecificExitCode = 0;
hServStatus.dwCheckPoint = 0;
Roll no:10015603121
hServStatus.dwWaitHint = 2 * UPDATE_TIME;
SetServiceStatus(hSStat, &hServStatus);
UpdateStatus(SERVICE_RUNNING, -1);
while (!shutDown) {
Sleep(UPDATE_TIME);
UpdateStatus(-1, -1);
UpdateStatus(SERVICE_STOPPED, 0);
switch (dwControl) {
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
shutDown = TRUE;
UpdateStatus(SERVICE_STOP_PENDING, -1);
break;
Roll no:10015603121
case SERVICE_CONTROL_PAUSE:
pauseFlag = TRUE;
break;
case SERVICE_CONTROL_CONTINUE:
pauseFlag = FALSE;
break;
case SERVICE_CONTROL_INTERROGATE:
// Respond to interrogation
break;
default:
break;
UpdateStatus(-1, -1);
Roll no:10015603121
else hServStatus.dwCheckPoint = Check;
TCHAR cTimeString[30];
cTimeString[_tcslen(cTimeString) - 2] = _T('\0');
if (logFp != NULL) {
Roll no:10015603121
else if (type == EVENTLOG_WARNING_TYPE)
else
fflush(logFp);
fclose(logFp);
Output:
Roll no:10015603121
Roll no:10015603121