2011-12-05 2 views
1

제목이 맞는지 확실하지 않지만 문제가 있다고 생각합니다. I는이 코드 부분을 가지고포인터 연산

FILE_DIRECTORY_INFORMATION *Buffer; 
Buffer = ExAllocatePoolWithTag (NonPagedPool, 4096, 'arK'); 
..<fill in data into the buffer>.. 
//Values here are: Buffer:0x81490000; NextEntryOffset:0x48 
Buffer += Buffer->NextEntryOffset; 
//Values here are: Buffer:0x81491440; NextEntryOffset:0x0 

문제 대신 간단한 추가로, 마지막 코드 라인은 승산을 수행한다는 것이다. 새로운 버퍼 값은 적어도 81490048이되어야하지만 81491440 (81490000 + 48 * 48)이어야합니다. 아무도 그 이유를 설명 할 수 있습니까?

추신 : 나는 모든 값을 체크했다. VS11을 사용하여 컴파일하면 마지막 코드 행이 실제로 imul 명령으로 변환됩니다.

답변

3

C에서 포인터 연산이 작동하는 방식입니다. 포인터에 'X'를 추가한다는 것은 실제로 시작점 메모리 위치에 pointee의 X 시간을 더하는 것을 의미합니다.

아마도 임시 char *으로 전송할 수 있다고 생각합니다.하지만 이유를 생각할 수 없습니다.

+0

그래서 기본적으로 숫자로만 처리하면됩니다. char *로 변환하는 것은 트릭을 만들었습니다 (원래 BYTE가 필요했지만 헤더에 정의되지 않았습니다). 드라이버가 현재 잘 작동하고 있습니다. 사용자 모드 응용 프로그램을 작성할 때 찾지 못했습니다. 감사합니다. – Kra

1

이있는 경우 :

T *p; 
p += n; 

을 다음이있다 (대략) 상당에 : 즉

T *p; 
char *p2 = (char *)p; 
p2 += n * sizeof(T); 
p = (T *)p2; 

, 컴파일러는 효과적으로 당신을 위해 곱셈을 수행합니다.

1

정수에 포인터를 추가하면 정수 값에 포인터가 가리키는 형식 크기를 곱한 값만큼 포인터 값이 증가합니다. sizeof(FILE_DIRECTORY_INFORMATION)이 48 인 경우 포인터에 하나를 추가하면 48이 이동하고 2는 2 * 48을 추가합니다.