diff options
Diffstat (limited to 'emu/Nt/devarch.c')
| -rw-r--r-- | emu/Nt/devarch.c | 69 |
1 files changed, 48 insertions, 21 deletions
diff --git a/emu/Nt/devarch.c b/emu/Nt/devarch.c index eea152fc..507f9f3f 100644 --- a/emu/Nt/devarch.c +++ b/emu/Nt/devarch.c @@ -13,7 +13,6 @@ #include "error.h" #include "r16.h" - enum{ Qdir, Qarchctl, @@ -38,8 +37,7 @@ struct Value { union { ulong w; vlong q; - Rune utf[1]; /* more allocated as required */ - char data[1]; + char data[1]; /* utf-8 */ }; }; @@ -66,8 +64,7 @@ static struct { static QLock reglock; -extern wchar_t *widen(char*); -static Value* getregistry(HKEY, Rune*, Rune*); +static Value* getregistry(HKEY, Rune16*, Rune16*); static int nprocs(void); static void @@ -78,7 +75,7 @@ archinit(void) v = getregistry(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", L"ProcessorNameString"); if(v != nil){ - snprint(arch.cpu, sizeof(arch.cpu), "%S", v->utf); + snprint(arch.cpu, sizeof(arch.cpu), "%s", v->data); if((p = strrchr(arch.cpu, ' ')) != nil) for(; p >= arch.cpu && *p == ' '; p--) *p = '\0'; @@ -86,7 +83,7 @@ archinit(void) }else{ v = getregistry(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", L"VendorIdentifier"); if(v != nil){ - snprint(arch.cpu, sizeof(arch.cpu), "%S", v->utf); + snprint(arch.cpu, sizeof(arch.cpu), "%s", v->data); free(v); }else snprint(arch.cpu, sizeof(arch.cpu), "unknown"); @@ -104,7 +101,7 @@ nprocs(void) { int n; char *p; - Rune *r; + Rune16 *r; Value *v; n = 0; for(;;){ @@ -207,18 +204,18 @@ archread(Chan* c, void* a, long n, vlong offset) #endif case REG_SZ: case REG_EXPAND_SZ: - if(v->utf[0]) - snprint(p, READSTR, "str %Q", v->utf); + if(v->data[0]) + snprint(p, READSTR, "str %q", v->data); n = readstr(offset, a, n, p); break; case REG_MULTI_SZ: l = snprint(p, READSTR, "str"); for(i=0;;){ - l += snprint(p+l, READSTR-l, " %Q", v->utf+i); - while(v->utf[i++] != 0){ + l += snprint(p+l, READSTR-l, " %q", v->data+i); + while(v->data[i++] != 0){ /* skip */ } - if(v->utf[i] == 0) + if(v->data[i] == 0) break; /* final terminator */ } n = readstr(offset, a, n, p); @@ -273,7 +270,7 @@ archwrite(Chan* c, void* a, long n, vlong offset) Value *v; int i; Cmdbuf *cb; - Rune *key, *item; + Rune16 *key, *item; if((ulong)c->qid.path != Qregquery) error(Eperm); @@ -339,22 +336,27 @@ Dev archdevtab = { static void regerr(int rc) { - Rune err[64]; + Rune16 err[64]; + char emsg[sizeof(err)*UTFmax+1]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, rc, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), err, sizeof(err), 0); - errorf("%S", err); + runes16toutf(emsg, err, nelem(err)); + error(emsg); } static Value* -getregistry(HKEY root, Rune *keyname, Rune *name) +getregistry(HKEY root, Rune16 *keyname, Rune16 *name) { long res; HKEY key; DWORD dtype, n; + int i, l, nb; void* vp; + char *p; Value *val; + Rune16 *rb; qlock(®lock); if(waserror()){ @@ -372,13 +374,22 @@ getregistry(HKEY root, Rune *keyname, Rune *name) res = RegQueryValueEx(key, name, NULL, &dtype, NULL, &n); if(res != ERROR_SUCCESS) regerr(res); - val = smalloc(sizeof(Value)+n); + nb = n; + if(dtype == REG_SZ || dtype == REG_EXPAND_SZ || dtype == REG_MULTI_SZ){ + nb = n*UTFmax + 1; + rb = smalloc((n+2)*sizeof(Rune16)); + memset(rb, 0, (n+2)*sizeof(Rune16)); + }else + rb = nil; + if(waserror()){ + free(rb); + nexterror(); + } + val = smalloc(sizeof(Value)+nb); if(waserror()){ free(val); nexterror(); } - if(0) - fprint(2, "%S\\%S: %d %d\n", keyname, name, dtype, n); val->type = dtype; val->size = n; switch(dtype){ @@ -393,7 +404,7 @@ getregistry(HKEY root, Rune *keyname, Rune *name) case REG_SZ: case REG_EXPAND_SZ: case REG_MULTI_SZ: - vp = val->utf; + vp = rb; break; case REG_BINARY: case REG_NONE: @@ -407,6 +418,22 @@ getregistry(HKEY root, Rune *keyname, Rune *name) if(res != ERROR_SUCCESS) regerr(res); poperror(); + if(rb != nil){ + if(dtype == REG_MULTI_SZ){ + p = val->data; + for(i=0;;){ + l = runes16len(rb+i); + runes16toutf(p, rb+i, l); + i += l+1; + if(rb[i] == 0) + break; + p += strlen(p)+1; + } + }else + runes16toutf(val->data, rb, n); + free(rb); + } + poperror(); poperror(); RegCloseKey(key); poperror(); |
