There's code using this in Roadmap, and it works.
Included below.
Danny
const char *roadmap_file_map (const char *path,
const char *name,
const char *mode,
RoadMapFileContext *file)
{
RoadMapFileContext context;
DWORD file_size;
const char *full_name;
context = malloc (sizeof(*context));
roadmap_check_allocated(context);
context->hFile = INVALID_HANDLE_VALUE;
context->base = NULL;
context->name = NULL;
context->size = 0;
if (name[0] == '\\') {
full_name = name;
} else {
full_name = roadmap_path_join (path, name);
}
context->name = ConvertToUNICODE(full_name);
context->hFile = CreateFileForMapping(
context->name,
GENERIC_READ ,
FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (context->hFile == INVALID_HANDLE_VALUE ) {
roadmap_log (ROADMAP_INFO, "cannot open file %s",
full_name);
roadmap_file_unmap (&context);
return NULL;
}
file_size = GetFileSize(context->hFile, NULL);
if (file_size == INVALID_FILE_SIZE) {
roadmap_log (ROADMAP_ERROR, "cannot get size of file %
s", full_name);
roadmap_file_unmap (&context);
return NULL;
}
context->size = file_size;
context->hFile = CreateFileMapping(
context->hFile,
NULL,
PAGE_READONLY,
0,0,0);
if (context->hFile == INVALID_HANDLE_VALUE) {
roadmap_log (ROADMAP_INFO, "cannot open file %s",
full_name);
roadmap_file_unmap (&context);
return NULL;
}
context->base = MapViewOfFile(context->hFile, FILE_MAP_READ, 0,
0, 0 );
if (context->base == NULL) {
roadmap_log (ROADMAP_ERROR, "cannot map file %s",
full_name);
roadmap_file_unmap (&context);
return NULL;
}
*file = context;
roadmap_log (ROADMAP_INFO, "Mapped file %s", full_name);
return context->base;
}
On Sun, 2008-06-08 at 09:37 +0200, Vincent Torri wrote:
Hey,
I want to simulate mmap on windows ce. I've already written a code that
works on Windows XP. I thought that there would be no problem on Windows
CE, but it seems that CreateFileMapping() returns always an error.
Here is my complete test code :
/* arm-wince-cegcc-gcc -O3 -Wall -mwin32 -o cegcc_test1.exe cegcc_test1.c
-Wl,--enable-auto-import -Wl,-s */
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
# include <wchar.h>
wchar_t *
evil_char_to_wchar(const char *text)
{
wchar_t *wtext;
int wsize;
wsize = MultiByteToWideChar(CP_ACP, 0, text, strlen(text) + 1, NULL,
0);
if ((wsize == 0) ||
(wsize > (int)(ULONG_MAX/sizeof(wchar_t))))
return NULL;
wtext = malloc(wsize * sizeof(wchar_t));
if (wtext)
if (!MultiByteToWideChar(CP_ACP, 0, text, strlen(text) + 1, wtext,
wsize))
return NULL;
return wtext;
}
char *
evil_wchar_to_char(const wchar_t *text)
{
char * atext;
int size;
int asize;
size = wcslen(text) + 1;
asize = WideCharToMultiByte(CP_ACP, 0, text, size, NULL, 0, NULL,
NULL);
if (asize == 0)
return NULL;
atext = (char*)malloc((asize + 1) * sizeof(char));
if (atext)
if (!WideCharToMultiByte(CP_ACP, 0, text, size, atext, asize, NULL,
NULL))
return NULL;
atext[asize] = '\0';
return atext;
}
char *
evil_last_error_get(void)
{
char str[206];
LPTSTR str1;
char *str2;
DWORD err;
err = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
err,
0, // Default language
(LPTSTR)&str1,
0,
NULL);
#ifdef UNICODE
str2 = evil_wchar_to_char(str1);
LocalFree(str1);
#else
str2 = str1;
#endif /* ! UNICODE */
snprintf(str, 206, "(%ld) %s", err, str2);
LocalFree(str2);
return strdup(str);
}
int main (int argc, char *argv[])
{
FILE *fp;
int fd;
HANDLE handle;
HANDLE fm;
wchar_t *file;
fp = fopen (argv[1], "rb");
if (!fp) {
printf (" * fopen failed\n");
return -1;
}
fd = fileno (fp);
printf (" %p %d\n", fp, fd);
handle = (HANDLE)get_osfhandle (fd);
if (handle == INVALID_HANDLE_VALUE) {
printf(" * get_osfhandle failed\n");
return -1;
}
fm = CreateFileMapping(handle,
NULL,
PAGE_READONLY,
0,
0,
NULL);
if (!fm) {
printf (" * CreateFileMapping failed %s\n", evil_last_error_get());
return -1;
}
printf ("success\n");
return 0;
}
CreateFileMapping returns the error 6 "The handle is invalid." If I use
PAGE_READWRITE, I get the error 5 "Access is denied."
So I tried to create the handle with CreateFileForMapping(), using that
code:
file = evil_char_to_wchar(argv[1]);
handle = CreateFileForMapping(file, GENERIC_READ, 0, NULL, OPEN_EXISTING,
0, 0);
but then, the error is 87 "The parameter is incorrect."
Does someone know if CreateFileMapping() is working with cegcc ? And if
it is working, what is wrong in my code ?
thank you
Vincent Torri
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Cegcc-devel mailing list
Cegcc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cegcc-devel
--
Danny Backx ; danny.backx - at - scarlet.be ; http://danny.backx.info
--
Ce message a été vérifié par MailScanner
pour des virus ou des polluriels et rien de
suspect n'a été trouvé.
Message délivré par le serveur de messagerie de l'Université d'Evry.