RTLCopyMemory работает в Vista? - PullRequest
       44

RTLCopyMemory работает в Vista?

2 голосов
/ 21 декабря 2009

Я заметил, что RTL Move Память работает нормально. Но когда я пытаюсь использовать RTL Copy Memory, я получаю: «Не удается найти точку входа DLL RtlCopyMemory в kernel32». Вот моя декларация:

Private Declare Sub CopyMem Lib "kernel32" Alias "RtlCopyMemory" ( _
    ByVal dest As Long, _
    ByVal source As Long, _
    ByVal bytLen As Long)

Ответы [ 3 ]

5 голосов
/ 21 декабря 2009

RtlCopyMemory - это при условии встроенного . Он определен в winnt.h как memcpy. Это означает, что он не включен в Win32 DLL, он является частью библиотеки времени выполнения C. Вы можете попробовать импортировать memcpy из c:\windows\system32\msvcrt.dll.

3 голосов
/ 21 декабря 2009

Почему бы просто не использовать RtlMoveMemory? Он работает так же, как RtlCopyMemory, за исключением того, что он обрабатывает перекрывающуюся память другим способом.

Брюс МакКинни впервые использовал RtlMoveMemory более 10 лет назад, и с тех пор он стандарт для копирования памяти VB6.

1 голос
/ 18 октября 2010

Я знаю, что это старый вопрос, но у меня была та же проблема, поэтому я подумал, что смогу ответить.

RtlCopyMemory в kernel32.dll должен быть Экспорт вперед в ntdll, но почему-то ребята из MS пропустили этот в 64-разрядной версии Vista (не знаю, как на x86) (см. ниже).

Вы можете попробовать импортировать его напрямую из ntdll, если это только для ваших нужд.

РЕДАКТИРОВАТЬ: метод, который я имею в виду, не экспортируется, но с символами он виден в ntdll как RtlCopyMemoryNonTemporal

РЕДАКТИРОВАТЬ 2: Просто чтобы убедиться, что я проверил некоторые вещи, вот резюме:

  • RtlCopyMemory и RtlCopyMemoryNonTemporal экспортируются из ntdll.dll в Vista x64 (обычный, SP1, SP2)
  • есть экспорт вперед для RtlCopyMemory в kernel32.dll в x64 Vista
  • имеется не экспортировано RtlCopyMemoryNonTemporal в ntdll.dll в x86 Vista

Так и должно быть, если вы пишете приложение для x64.

P.S. Я ошибался насчет x64 против x86, потому что я компилировал приложение x86 и запускал его на x64 (режим WOW), поэтому он использовал 32-битную версию kernel32, ntdll, а не x64.

...