J'essaie d'ouvrir un handle vers le pilote de périphérique d'objet TCP.Lecture depuis un objet de périphérique TCP
Ceci est mon code:
NTSTATUS OpenTcpDeviceObject(PHANDLE tcpFile, ACCESS_MASK DesiredAccess) {
UNICODE_STRING fileName;
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK IOBlock;
RtlInitUnicodeString(&fileName, TEXT("\\Device\\Tcp"));
InitializeObjectAttributes(
&objectAttributes, &fileName, OBJ_CASE_INSENSITIVE, NULL, NULL);
NTSTATUS Status = NtOpenFile(
tcpFile, DesiredAccess | SYNCHRONIZE, &objectAttributes, &IOBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
*tcpFile = INVALID_HANDLE_VALUE;
return Status;
}
Cependant retourne Statut -1073741790
, la question est de savoir pourquoi ce ne fonctionne pas? Je cours ceci d'usermode, sur un compte de non-administrateur. D'après ce que je comprends, cette opération ne nécessite pas de privilèges d'administration tant que le ACCESS_MASK
est réglé sur FILE_READ_DATA
.
NOTE
Le Status
qui est retourné points ERROR_ACCESS_DENIED (5)
comme une erreur Dos. Mais comment peut-on refuser l'accès si je demande seulement des autorisations de lecture? Cependant, quand je lance GetAdaptersAddresses qui accède à l'objet périphérique Tcp, cela me permet d'accéder aux adresses de multidiffusion/monodiffusion sans privilèges!
Alors, quel est le problème?
@HarryJohnston Que voulez-vous dire? 'SYNCHRONIZE' est généralement inclus avec' FILE_READ_DATA' - pourquoi serait-ce le problème? –
Il n'y a pas de règle AFAIK qui dit que vous devez recevoir 'SYNCHRONIZE' si vous avez reçu' FILE_READ_DATA' de sorte que * pourrait * avoir été le problème. Il s'avère que ce n'était pas le cas, mais ça aurait pu l'être. :-) –