PDA

Просмотр полной версии : Обход ограничений Fat32/ntfs (си)


DaemoniZ
03.05.2008, 12:50
В хорошо изветном нам глянцевом жюрнале за февраль 2004 года (#062) была статья на эту тему. В ней был преведен код по сабжу


#include <windows.h>

void main()

{

char *old = "C:\\TMP\\somefile.txt";

char *_new = "C:\\TMP\\twodots..";

//переменные для нового и старого имени файла

char *newname;

wsprintf(newname,"%s.\\",_new);

//добавляем символы «.\» в новое имя файла

MoveFile(old, newname);

//переименовываем файл

}

Не могу скомпилировать. VC6 ругается:


--------------------Configuration: tryfatntfs - Win32 Debug--------------------
Compiling...
main.cpp C:\Program Files (x86)\Microsoft Visual Studio\MyProjects\tryfatntfs\main.cpp(15) : warning C4700: local variable 'newname' used without having been initialized
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/tryfatntfs.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
tryfatntfs.exe - 2 error(s), 1 warning(s)



С другим способом тоже проблема:

#include <windows.h>

#include <iostream.h>

void CreateStrangeFile(char *filename)

{

char *curdir; //текущая папка

char *uncpath; //полный путь до файла в формате UNC

GetCurrentDirectory(MAX_PATH,curdir); //получаем текущий каталог

wsprintf(uncpath,"\\\\?\\%s\\%s",curdir, filename); //формируем UNC-путь

HANDLE hFile = CreateFile( uncpath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,

CREATE_ALWAYS, NULL, NULL);

//создаем новый файл

DWORD ret;

__try {

WriteFile(hFile,"This is a super secret info",28,&ret, NULL);

//записываем секретную инфу

}

__finally {

CloseHandle(hFile);

//закрываем файл

}

}

void main()

{

CreateStrangeFile("prn");

//создаем файл «prn»

}

--------------------Configuration: tryfatntfs - Win32 Debug--------------------
Compiling...
main.cpp
C:\Program Files (x86)\Microsoft Visual Studio\MyProjects\tryfatntfs\main.cpp(13) : warning C4700: local variable 'curdir' used without having been initialized
C:\Program Files (x86)\Microsoft Visual Studio\MyProjects\tryfatntfs\main.cpp(15) : warning C4700: local variable 'uncpath' used without having been initialized
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/tryfatntfs.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

tryfatntfs.exe - 2 error(s), 2 warning(s)




Как исправить?


Оригинал статьи (http://www.xakep.ru/magazine/xa/062/080/1.asp)

arpm
03.05.2008, 13:19
Наиболее вероятная пролема - линкер думает, что собирает не консольное приложение, а вин32 приложение, и поэтому ищет entrypoint WinMain()

DaemoniZ
03.05.2008, 13:21
Собираю точно консольное приложение. Побовал кстати компилировать с помошью C++Builder 2007. Тоже не получается.

criz
03.05.2008, 13:26
Наиболее вероятная пролема - линкер думает, что собирает не консольное приложение, а вин32 приложение, и поэтому ищет entrypoint WinMain()
+1.
Вот, что говорит микрософт:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;125750

DaemoniZ
03.05.2008, 13:26
Блин. Извиняюсь. Действительно. Вы правы.

criz
03.05.2008, 14:00
А зачем нужно вот это:
char *newname;

wsprintf(newname,"%s.\\",_new);

?
можно же другим способом "склеить строки"

DaemoniZ
03.05.2008, 14:04
Может только с помошью wsprintf можно задать неправильное имя?

Появилась другая проблема. Программа падает при запуске.

criz
03.05.2008, 15:07
Попробуй использовать:
wchar_t *wcscat( wchar_t *strDestination, const wchar_t *strSource );

DaemoniZ
03.05.2008, 19:47
эээммм.... пожно поподробнее, как?