ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Проблемка с дампом оптических дисков
  #1  
Старый 23.06.2009, 17:58
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию Проблемка с дампом оптических дисков

С обычными сд все ОК а с двд копирование может оборватся на средине
Код:
#include <windows.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{ 
	HANDLE hh=GetProcessHeap();
	ULARGE_INTEGER TNOFB;
	DWORD rb,wb;unsigned long curpos=0;
	char *buf=(char*)HeapAlloc(hh,HEAP_ZERO_MEMORY,(1024*1024)*10);
	char dsk[35],dd[5],buff[1024];
	strcpy(dsk,"\\\\.\\");
	cout<<"DISK name:"<<endl;
	cin>>dd;strcat(dsk,dd);
	HANDLE d=CreateFile(dsk,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL);
	if(d==INVALID_HANDLE_VALUE){cout<<dsk<<" oups :("<<endl;goto End;}
	HANDLE f=CreateFile("D:\\dump.iso",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_FLAG_RANDOM_ACCESS,NULL);
	GetDiskFreeSpaceEx(dd,0,&TNOFB,0);
	wsprintf(buff,"%I64u",TNOFB.QuadPart);
	cout<<"ds:"<<buff;
	for(;;)
	{
		ReadFile(d,buf,(1024*1024)*10,&rb,NULL);
		system("cls");
		if(rb==0){break;}
		curpos=curpos+rb;
		cout<<curpos<<endl<<"FROM:"<<endl<<buff;
		SetFilePointer(d,curpos,NULL,FILE_BEGIN);
		WriteFile(f,buf,rb,&wb,0);
	}
	CloseHandle(d);
	CloseHandle(f);
	cout<<"DONE";
End:
	getch();
	HeapFree(hh,0,buf);
	return 0;
}
Почему так?Какая то ошибка чтения?
 
Ответить с цитированием

  #2  
Старый 23.06.2009, 18:35
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме:
991929

Репутация: 395


По умолчанию

SetFilePointer(d,curpos,NULL,FILE_BEGIN);
если третий параметр NULL то она не работает с размерами больше 2гигов...
Цитата:
Сообщение от MSDN  
Хотя параметр lpDistanceToMoveHigh используется, чтобы управлять огромными файлами, значение этого параметра должно устанавливаться при перемещении в файлах любого размера. Если он устанавливается в ПУСТО (NULL), то lDistanceToMove имеет максимальное значение 2(31)-2, или 2 гигабайта без двух байтов. Это так потому, что все значения указателя позиции в файле - значения со знаком. Поэтому, даже если есть маленький шанс, что файл будет расти до этого размера, вам следует рассматривать его как огромный файл и работать с 64-разрядными указателями позиции в файле.
вот примерчик приведен для упрощения небольшого
Код:
__int64 myFileSeek (HANDLE hf, __int64 distance, DWORD MoveMethod)
{
   LARGE_INTEGER li;

   li.QuadPart = distance;

   li.LowPart = SetFilePointer (hf, li.LowPart, &li.HighPart,
                                 MoveMethod);

   if (li.LowPart == INVALID_SET_FILE_POINTER && GetLastError()
       != NO_ERROR)
   {
      li.QuadPart = -1;
   }

   return li.QuadPart;
}

Последний раз редактировалось Gar|k; 23.06.2009 в 18:47..
 
Ответить с цитированием

  #3  
Старый 23.06.2009, 19:13
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

То есть смещение надо в моем случае совать в lpDistanceToMoveHigh ?
 
Ответить с цитированием

  #4  
Старый 23.06.2009, 19:20
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме:
991929

Репутация: 395


По умолчанию

нет...
берешь функцию которую я написал и меняешь в своей проге это:
unsigned long curpos=0; на это __int64 curpos=0;

далее меняешь это SetFilePointer(d,curpos,NULL,FILE_BEGIN); на это myFileSeek(d,curpos,FILE_BEGIN);
 
Ответить с цитированием

  #5  
Старый 23.06.2009, 19:25
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

Цитата:
Сообщение от Gar|k  
нет...
берешь функцию которую я написал и меняешь в своей проге это:
unsigned long curpos=0; на это __int64 curpos=0;

далее меняешь это SetFilePointer(d,curpos,NULL,FILE_BEGIN); на это myFileSeek(d,curpos,FILE_BEGIN);
Да я понял как можно твей ф-цией воспользоватся.Но мне хотелось бы понять как просчитывается lpDistanceToMoveHigh
ЗЫ: ещё такой вопрос ,систем при дамп диска начинает лагать.Когда делаю дамп ультра исо лагов нет.В чем моя ошибка?

Последний раз редактировалось _nic; 23.06.2009 в 19:41..
 
Ответить с цитированием

  #6  
Старый 23.06.2009, 20:04
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме:
991929

Репутация: 395


По умолчанию

"Но мне хотелось бы понять как просчитывается lpDistanceToMoveHigh" - RTFM (сам не знаю долго помню ипался когда работу с жестким на прямую делал...)

Лагает возможно из-за твоей кривизны... мне кажется у тебя с потолка берутся значения выделяемой памяти, непонятный бесконечный цикл.... ты что не можешь получить сначала размер файла потом выделить нужное количество памяти и прочесть его туда?

еще посмотри по теме файлового маппинга в память... http://msdn.microsoft.com/en-us/library/aa366556(VS.85).aspx

http://wasm.ru/article.php?article=1001013

я просто не знаю что тебе конкретно надо

Последний раз редактировалось Gar|k; 23.06.2009 в 20:14..
 
Ответить с цитированием

  #7  
Старый 23.06.2009, 20:25
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

Выделить 4гига(при условии 64 разрядности ОС)? О_о А если двд не 5го а 8го формата попадется?Что тогда?

Последний раз редактировалось _nic; 23.06.2009 в 20:28..
 
Ответить с цитированием

  #8  
Старый 23.06.2009, 20:39
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме:
991929

Репутация: 395


По умолчанию

мда.... 4 гига это не предел... я тебе говорю смотри в сторону файл маппинга.
 
Ответить с цитированием

  #9  
Старый 23.06.2009, 20:44
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

Цитата:
Сообщение от Gar|k  
мда.... 4 гига это не предел... я тебе говорю смотри в сторону файл маппинга.
Кстати с твоей ф-цией то же на 2х гигах спотыкается.
Насчет маппинга- надо спроецировать файл в память?
 
Ответить с цитированием

  #10  
Старый 23.06.2009, 21:36
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме:
991929

Репутация: 395


По умолчанию

_nic за тебя программу написать? RTFM!!!
http://wasm.ru/article.php?article=1001013
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подставка для дисков "CD-Бидон" своими руками dinar_007 Аппаратное обеспечение 5 27.01.2008 18:47
Восстановление данных с лазерных дисков silveran Аппаратное обеспечение 5 10.09.2005 13:46



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ