Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Read\Write To Memory Mapped File / 10 сообщений из 10, страница 1 из 1
08.12.2005, 20:13
    #33426079
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read\Write To Memory Mapped File
Пробую написать програмулину, чтобы можна было читать/писать в существующий файл через память. По завершения программы - файл не обновляется. Это вообще можно делать? Если да, то как?

Спасиба.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
// Encrypt.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <conio.h>
#include <windows.h>

void print_last_err()
{
	LPVOID lpMsgBuf;
	FormatMessage( 
		FORMAT_MESSAGE_ALLOCATE_BUFFER | 
		FORMAT_MESSAGE_FROM_SYSTEM | 
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL,
		GetLastError(),
		 0 , // Default language
		(LPTSTR) &lpMsgBuf,
		 0 ,
		NULL 
	);
	printf((LPCTSTR)lpMsgBuf);
	LocalFree( lpMsgBuf );
}
int _tmain(int argc, _TCHAR* argv[])
{
	printf("File Encryptor.");
	HANDLE hFile= CreateFile("D:\\Visual Studio Projects\\Encrypt\\Debug\\testfile.bin", 
							 GENERIC_READ || GENERIC_WRITE,
							 FILE_SHARE_READ || FILE_SHARE_WRITE,
							  0 ,
							 OPEN_EXISTING,
							 FILE_FLAG_SEQUENTIAL_SCAN,
							  0 );

	if (hFile != INVALID_HANDLE_VALUE)
	{
		HANDLE hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, 
											NULL,
											PAGE_READWRITE | SEC_COMMIT,
											 0 ,
											 1000 ,
											 0 );
		if (hFileMap != NULL )
		{
		  LPVOID lpMapAddress = MapViewOfFile(hFileMap, 
										FILE_MAP_ALL_ACCESS,
										 0 ,
										 0 ,
										 0 );
		  if (lpMapAddress != NULL)
		  {
			  LPVOID lpMapAddressStart = lpMapAddress;
			  char buff[ 1000 ];
			  memcpy(buff, (LPVOID)lpMapAddressStart,  20 );
			  //lpMapAddress = (LPVOID)"WWWWWWWWWWWWWWWWWWWWWWWW";
			  if (!FlushViewOfFile(lpMapAddressStart,  0 ))
				  print_last_err();
		  }
		  else
			  print_last_err();

		}
		else
			print_last_err();

		CloseHandle(hFileMap);

	}else
		print_last_err();

	CloseHandle(hFile);

	return  0 ;
}
...
Рейтинг: 0 / 0
08.12.2005, 22:54
    #33426205
Read\Write To Memory Mapped File
HANDLE hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1000, 0);

и хде тута хэндл файла?
...
Рейтинг: 0 / 0
08.12.2005, 23:11
    #33426217
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read\Write To Memory Mapped File
дурацкий вопросHANDLE hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1000, 0);

и хде тута хэндл файла?

Точно замечено :) Дал не тот сорс код. Пробовал и с хендлом файла. На READ_ONLY еще открывает, а на READWRITE дает ошибку Access Denied. Прошелся по интернету, говорят с некоторых пор CreateFileMapping стала превилигированной операцией, требуется настройка DACL (второй параметр фунции), как - непонятно. Хотя если процесс исполняется в текущей сессии пользователя, а оно так, должен и дефолт (NULL) DACL работать. Вдвойне не понятно. Ну а вобще, можно ли открыть существующий факл на диске таким вензелем и read/write в него, а?
...
Рейтинг: 0 / 0
08.12.2005, 23:33
    #33426230
Read\Write To Memory Mapped File
GENERIC_READ || GENERIC_WRITE

Это что за операция такая?
...
Рейтинг: 0 / 0
09.12.2005, 00:02
    #33426246
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read\Write To Memory Mapped File
Спасиба, почти работает. Вот там, где <--AV ложится. ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
// Encrypt.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <conio.h>
#include <windows.h>
#include <sddl.h>

void print_last_err()
{
	LPVOID lpMsgBuf;
	FormatMessage( 
		FORMAT_MESSAGE_ALLOCATE_BUFFER | 
		FORMAT_MESSAGE_FROM_SYSTEM | 
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL,
		GetLastError(),
		 0 , // Default language
		(LPTSTR) &lpMsgBuf,
		 0 ,
		NULL 
	);
	printf((LPCTSTR)lpMsgBuf);
	LocalFree( lpMsgBuf );
}


int _tmain(int argc, _TCHAR* argv[])
{
	printf("File Encryptor.");

	HANDLE hFile= CreateFile("D:\\Visual Studio Projects\\Encrypt\\Debug\\testfile.bin", 
							 GENERIC_READ | GENERIC_WRITE,
							 FILE_SHARE_WRITE,
							  0 ,
							 OPEN_EXISTING,
							 FILE_ATTRIBUTE_TEMPORARY,
							  0 );

	DWORD nFileSize = GetFileSize(hFile, NULL);

	if (hFile != INVALID_HANDLE_VALUE)
	{
		HANDLE hFileMap = CreateFileMapping(hFile/*INVALID_HANDLE_VALUE*/, 
											NULL,
											PAGE_READWRITE,
											 0 ,
											 0 ,
											 0 );
		if (hFileMap != NULL )
		{
			LPVOID lpMapAddress = MapViewOfFile(hFileMap, 
										FILE_MAP_READ,
										 0 ,
										 0 ,
										 0 );
			if (lpMapAddress != NULL)
			{
				LPVOID lpMapAddressStart = lpMapAddress;
				char buff[ 1000 ];
				memcpy(buff, lpMapAddressStart, nFileSize);
				memcpy(lpMapAddressStart), buff, nFileSize);//<-- AV
				if (!FlushViewOfFile(lpMapAddressStart,  0 ))
					  print_last_err();
			}
			else
				print_last_err();

		}
		else
			print_last_err();

		CloseHandle(hFileMap);

	}else
		print_last_err();

	CloseHandle(hFile);

	return  0 ;
}
...
Рейтинг: 0 / 0
09.12.2005, 11:15
    #33426854
Read\Write To Memory Mapped File
LPVOID lpMapAddress = MapViewOfFile(hFileMap, FILE_MAP_READ , 0, 0, 0);

FILE_MAP_ALL_ACCESS
...
Рейтинг: 0 / 0
09.12.2005, 18:21
    #33428313
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read\Write To Memory Mapped File
ты документацию читаешь?LPVOID lpMapAddress = MapViewOfFile(hFileMap, FILE_MAP_READ , 0, 0, 0);

FILE_MAP_ALL_ACCESS

Спасиба работает. Документацию некогда читать, просто переделывалось с readonly проджекта, ну и не все было вычищено :)
...
Рейтинг: 0 / 0
09.12.2005, 23:23
    #33428612
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read\Write To Memory Mapped File
Написан простой перекодировщик файлов с использованием CreateFile\ReadFile\WriteFile и Memory Mapped File. Второй дает выиграш по скорости в 1.5 раза, что особенно ценно при перекодировке гигабайтных файлов.
...
Рейтинг: 0 / 0
10.12.2005, 00:06
    #33428631
гы-гы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read\Write To Memory Mapped File
так это не выигрышь, это так - "гуляем"
...
Рейтинг: 0 / 0
10.12.2005, 03:47
    #33428687
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read\Write To Memory Mapped File
гы-гытак это не выигрышь, это так - "гуляем"
Предложи варианты.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Read\Write To Memory Mapped File / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]