00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#include "precomp.h"
00018
#pragma hdrstop
00019
00020
#if defined(i386)
00021
00022
00023
#define REGISTRY_HARDWARE_DESCRIPTION \
00024
TEXT("\\Registry\\Machine\\Hardware\\DESCRIPTION\\System")
00025
00026
#define REGISTRY_MACHINE_IDENTIFIER \
00027
TEXT("Identifier")
00028
00029
#define FUJITSU_FMR_NAME TEXT("FUJITSU FMR-")
00030
#define NEC_PC98_NAME TEXT("NEC PC-98")
00031
00032
00033
00034
#define KEY_WORK_AREA ((sizeof(KEY_VALUE_FULL_INFORMATION) + \
00035
sizeof(ULONG)) + 256)
00036
00037
NTSTATUS
00038 NtGetMachineIdentifierValue(
00039 IN OUT PULONG Value
00040 )
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 {
00067 HANDLE
Handle;
00068
NTSTATUS Status;
00069 ULONG RequestLength;
00070 ULONG ResultLength;
00071 UCHAR
Buffer[
KEY_WORK_AREA];
00072 UNICODE_STRING
KeyName;
00073 UNICODE_STRING
ValueName;
00074 OBJECT_ATTRIBUTES
ObjectAttributes;
00075 PKEY_VALUE_FULL_INFORMATION KeyValueInformation;
00076
00077
00078
00079
00080
00081 *Value = MACHINEID_MS_PCAT;
00082
00083
KeyName.Buffer = REGISTRY_HARDWARE_DESCRIPTION;
00084
KeyName.Length =
sizeof(REGISTRY_HARDWARE_DESCRIPTION) -
sizeof(WCHAR);
00085
KeyName.MaximumLength =
sizeof(REGISTRY_HARDWARE_DESCRIPTION);
00086
00087 InitializeObjectAttributes(&ObjectAttributes,
00088 &KeyName,
00089 OBJ_CASE_INSENSITIVE,
00090 NULL,
00091 NULL);
00092
00093
Status =
NtOpenKey(&Handle,
00094 KEY_READ,
00095 &ObjectAttributes);
00096
00097
if (!
NT_SUCCESS(Status)) {
00098
00099
return Status;
00100 }
00101
00102
ValueName.Buffer = REGISTRY_MACHINE_IDENTIFIER;
00103
ValueName.Length =
sizeof(REGISTRY_MACHINE_IDENTIFIER) -
sizeof(WCHAR);
00104
ValueName.MaximumLength =
sizeof(REGISTRY_MACHINE_IDENTIFIER);
00105
00106 RequestLength =
KEY_WORK_AREA;
00107
00108 KeyValueInformation = (PKEY_VALUE_FULL_INFORMATION)
Buffer;
00109
00110
Status =
NtQueryValueKey(Handle,
00111 &ValueName,
00112 KeyValueFullInformation,
00113 KeyValueInformation,
00114 RequestLength,
00115 &ResultLength);
00116
00117
ASSERT( Status != STATUS_BUFFER_OVERFLOW );
00118
00119
NtClose(Handle);
00120
00121
if (
NT_SUCCESS(Status)) {
00122
00123
if (KeyValueInformation->DataLength != 0) {
00124
00125 PWCHAR DataPtr;
00126 UNICODE_STRING DetectedString, TargetString1, TargetString2;
00127
00128
00129
00130
00131
00132 DataPtr = (PWCHAR)
00133 ((PUCHAR)KeyValueInformation + KeyValueInformation->DataOffset);
00134
00135
00136
00137
00138
00139
RtlInitUnicodeString( &DetectedString, DataPtr );
00140
RtlInitUnicodeString( &TargetString1, FUJITSU_FMR_NAME );
00141
RtlInitUnicodeString( &TargetString2, NEC_PC98_NAME );
00142
00143
00144
00145
00146
00147
if (
RtlPrefixUnicodeString( &TargetString1 , &DetectedString , TRUE)) {
00148
00149
00150
00151
00152
00153 *Value = MACHINEID_FUJITSU_FMR;
00154
00155 }
else if (
RtlPrefixUnicodeString( &TargetString2 , &DetectedString , TRUE)) {
00156
00157
00158
00159
00160
00161 *Value = MACHINEID_NEC_PC98;
00162
00163 }
else {
00164
00165
00166
00167
00168
00169 *Value = MACHINEID_MS_PCAT;
00170
00171 }
00172
00173 }
else {
00174
00175
00176
00177
00178
00179
Status = STATUS_OBJECT_NAME_NOT_FOUND;
00180 }
00181
00182 }
00183
00184
return Status;
00185 }
00186
#endif // defined(i386)