2013-08-18 2 views
1

저는 Uart16550 드라이버를 작성하고 있는데, RtlQueryRegistryValues를 사용하여 초기화 매개 변수를 레지스트리에서 읽어야합니다. RtlQueryRegistryValues ​​REG_DWORD를 읽습니다.

는 매개 변수가 REG_DWORD로 레지스트리에 저장됩니다

RTL_QUERY_REGISTRY_TABLE table[2]; 

table[1].QueryRoutine = NULL; 
table[1].Name = NULL; 

을 (코드의 많은 ... 생략) 나는 내 테이블을 설정하기 위해 노력하고있어 :

unsigned long buffer; 

(DWORD가 ntddk.h에 정의되어 있지 나는 내가 WinDef.h 포함 치신 있는지 확실하지 않습니다 때문에),451,515,및

table[0].EntryContext = &buffer; 

RtlQueryRegistryValues에 대한 호출의 상태는 STATUS_SUCCESS

status = RtlQueryRegistryValues(
    RTL_REGISTRY_ABSOLUTE, 
    path, 
    table, 
    NULL, 
    NULL); 

하지만 난이

DbgPrint("registry: %lu", buffer) 

하려고 할 때 내가 할 결과를 예상 (너무 큰 숫자를 얻을 수 1 또는 2).

DbgPrint에 문제가 있거나 매개 변수가 쿼리 테이블에 올바르게 설정되어 있지 않습니까?

그리고 RED_DWORD 데이터 형식은 어디에 정의되어 있습니까?

편집 :

WCHAR keyname[20] = "parameter"; 
CHAR def[20] = "parameter"; 
WCHAR path[100] = L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\hello\\Parameters"; 
unsigned long buffer; 
table[0].QueryRoutine = NULL; 
table[0].Name = keyname; 
table[0].Flags = RTL_QUERY_REGISTRY_DIRECT; 
table[0].EntryContext = &buffer; 
table[0].DefaultType = REG_DWORD; 
table[0].DefaultData = def; 
table[0].DefaultLength = strlen(def) + 1; 
+0

에서 누락 더 코드가 정의? 'table [0]'의 나머지 멤버들에 대한 다른 값은 무엇입니까? 그리고'상태'의 결과는 무엇입니까? –

+0

'WCHAR keyname [20] = "매개 변수"; CHAR def [20] = "매개 변수"; WCHAR 경로 [100] = L "\\ Registry \\ Machine \\ SYSTEM \\ CurrentControlSet \\ Services \\ hello \\ Parameters"; 부호없는 긴 버퍼 [100]; 테이블 [0] .QueryRoutine = NULL; table [0] .Name = keyname; table [0] .Flags = RTL_QUERY_REGISTRY_DIRECT; table [0] .EntryContext = buffer; table [0] .DefaultType = REG_DWORD; table [0] .DefaultData = def; 테이블 [0].DefaultLength = 나 strlen (DEF) + 1] ' 및 상태 스위치'(상태) { 케이스 STATUS_SUCCESS STATUS_SUCCESS 이다 \t DbgPrint (! "의 값을 발견"); 에서' – johnye2e

+0

레지스트리)? 나는 똑같은 문제에 직면하고있다. 키 저장 가치는 어디 있나? – johnye2e

답변

0

table[0].DefaultData는 부호 없음 long에 대한 포인터해야한다.
table[0].DefaultLength은 sizeof (부호없는 long) 여야합니다.

그렇지 않으면 1634886000이 기본값 ('para')으로 변환 될 수 있습니다. 키와 값이 실제로 존재한다고 가정 할 때 다른 모든 것이 제대로 작동해야합니다.


REG_DWORD는 WINNT.H

#define REG_DWORD     (4) // 32-bit number 
#define REG_DWORD_LITTLE_ENDIAN  (4) // 32-bit number (same as REG_DWORD) 
#define REG_DWORD_BIG_ENDIAN  (5) // 32-bit number 
+0

맞습니다. 또한'L 매크로'를 사용 했어야합니다 : 'WCHAR keyname = L "parametru"'(루마니아어 이름, 결코 신경 쓰지 마세요) – johnye2e