1 답변
-
CreateFile
는 아래 사진에 나와있는 프로젝트 설정 중문자 집합
의 값에 따라 의미하는 바가 달라지게 됩니다.문자 집합
의 값을유니코드 문자 집합 사용
을 설정면UNICODE
라는 전처리 매크로가 정의됩니다.UNICODE
에 따라 아래와 같이CreateFileW
가 사용될지CreateFileA
가 사용될지가 결정됩니다.경고를 보아하니 현재
UNICODE
가 설정되어 있고CreateFile
은CreateFileW
를 의미하게 됩니다.CreateFileW
는L
로 시작하는 와이드 캐릭터 문자열(L"hello"
)을 사용해야합니다. 하지만 사용하신"\\\\.\\physicalDrive0"
는 멀티 바이트 문자열입니다.Windows 에서 와이드 캐릭터 문자열은 한 문자를 2 바이트로 판단하기 때문에 그대로 실행하면 정상적인 동작을 하지 않습니다.
이에 대한 해결 방법은 두가지 정도가 있습니다.
_T
이용하기_T
는 처음에 설명한 설정에 따라 문자열의 종류를 자동으로 변경해 줍니다.HANDLE hFile = CreateFile(_T("\\\\.\\physicalDrive0"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
CreateFileA
또는CreateFileW
를 사용하기프로젝트 속성에 영향을 받지 않게 처음부터 사용할 문자열에 맞는 함수를 사용하면 됩니다.
HANDLE hFile = CreateFileA("\\\\.\\physicalDrive0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
로그를 추가해서 실행해 보았습니다.
일반 실행을 했을 때는 아래와 같이 장치를 열수 없었습니다.
관리자 권한으로 실행 했을 때 아래와 같이 장치가 열렸습니다.
그 후 재부팅을 하면 아래 처럼 부팅에 실패한 것을 확인할 수 있습니다.
즉, 장치에 직접 접근하는 프로그램에서 관리자 권한 없이 실행하여 장치를 열 수 없어 쓰기 작업이 이루어 지지 않았던 것입니다. 물론
CreateFileA
에로 변경하지 않았다면 제대로된 경로가 아니기에 장치도 열리지 않았을 것입니다.참고로
0코드로 인해 종료 되었습니다
란 말은 프로그램이 0을 반환했다는 말입니다. 프로그램이 0을 반환했다는 건 정상적으로 프로그램이 종료되었음을 의미합니다.- 말씀하신대로 문자집합에서 유니코드를 멀티바이트 문자 집합 사용으로 바꾸고 CreateFileA를 사용하니 [warning c4133: '함수' : 'char[19]'와 LPCWSTR사이의 형식이 호환되지 않습니다.]에러는 발생하지 않지만 여전히[xxxx프로세스이<가> 0코드로 인해 종료되었습니다.] 는 계속 cmd창으로 출력됩니다. 이건 어떻게 해야하시는지 알고 계시나요...? xxxx는 실행마다 값이 바뀌는 정수값입니다. 예)2456 ,3178, 4231 알 수 없는 사용자 2018.8.23 11:48
- 코드 수정하신게맞나요?? 해당 경고는 몇번 줄에서 발생하나요?? 유동욱 2018.8.23 12:15
- 밑에 답변 참고해주실 수 있나요? 알 수 없는 사용자 2018.8.23 15:33
- 답변 추가했습니다. 유동욱 2018.8.23 20:12
- 이렇게 정성껏 답해주셔서 정말 감사드립니다..ㅠㅠ 알 수 없는 사용자 2018.8.24 16:58
댓글 입력