RPA Toolkit
Fixed windows build
[rpatk.git] / rexcc / win32 / rexccdep.c
1 /*
2  *  Regular Pattern Analyzer Toolkit (RPA/Tk)
3  *  Copyright (c) 2009-2012 Martin Stoilov
4  *
5  *  This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation, either version 3 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  *
18  *  Martin Stoilov <martin@rpasearch.com>
19  */
20
21 #include <windows.h>
22 #include <stdio.h>
23 #include <tchar.h>
24 #include "rlib/rbuffer.h"
25 #include "rexccdep.h"
26
27
28 void rex_buffer_unmap_file(rbuffer_t *buf)
29 {
30         HANDLE hFile = INVALID_HANDLE_VALUE;
31         HANDLE hMapping = 0;
32
33         if (!buf)
34                 return;
35         hFile = (HANDLE) buf->userdata;
36         hMapping = (HANDLE) buf->userdata1;
37
38         if (hMapping)
39                 CloseHandle(hMapping);
40         if (hFile != INVALID_HANDLE_VALUE)
41                 CloseHandle(hFile);
42         if (buf->s)
43                 UnmapViewOfFile(buf->s);
44         free(buf);
45 }
46
47
48 rbuffer_t * rex_buffer_map_file(LPCTSTR pFileName)
49 {
50         rbuffer_t *buf;
51         char *pMappedView = 0;
52         HANDLE hFile = INVALID_HANDLE_VALUE;
53         HANDLE hMapping = 0;
54         unsigned __int64 fileSize;
55         DWORD sizeLo, sizeHi;
56
57         buf = (rbuffer_t *)malloc(sizeof(rbuffer_t));
58         if (!buf)
59                 goto error;
60         hFile = CreateFile(pFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0);
61         if (INVALID_HANDLE_VALUE == hFile)
62                 goto error;
63         sizeLo = GetFileSize(hFile, &sizeHi);
64         fileSize = (UINT64)sizeLo | ((UINT64)sizeHi << 32);
65         hMapping = CreateFileMapping(hFile, 0, PAGE_READONLY, sizeHi, sizeLo, 0);
66         if (!hMapping)
67                 goto error;
68         pMappedView = (char*)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
69         if (NULL == pMappedView)
70                 goto error;
71         buf->userdata = (void*)hFile;
72         buf->userdata1 = (void*)hMapping;
73         buf->s = pMappedView;
74         buf->size = (unsigned long)fileSize;
75         buf->alt_destroy = rex_buffer_unmap_file;
76         return buf;
77
78 error:
79         if (hMapping)
80                 CloseHandle(hMapping);
81         if (hFile != INVALID_HANDLE_VALUE)
82                 CloseHandle(hFile);
83         if (pMappedView)
84                 UnmapViewOfFile(pMappedView);
85         free(buf);
86         return (rbuffer_t*)0;
87 }
88